Python 至少在我看来,这与选项相同_2@ssoler:您的选项_2在所有行上都有前导空格;请注意,您的示例省略了select之前的前导空格。我的答案没有前导空格。是什么导致你认为它们是一样的?如果你把你的sql字符串放在一个方法中,你将不得不把所有的行列成表格(选

Python 至少在我看来,这与选项相同_2@ssoler:您的选项_2在所有行上都有前导空格;请注意,您的示例省略了select之前的前导空格。我的答案没有前导空格。是什么导致你认为它们是一样的?如果你把你的sql字符串放在一个方法中,你将不得不把所有的行列成表格(选,python,sql,string-formatting,Python,Sql,String Formatting,至少在我看来,这与选项相同_2@ssoler:您的选项_2在所有行上都有前导空格;请注意,您的示例省略了select之前的前导空格。我的答案没有前导空格。是什么导致你认为它们是一样的?如果你把你的sql字符串放在一个方法中,你将不得不把所有的行列成表格(选项2)。解决这个问题的一个可能的办法是选项3。@ssoler:对不起,我不明白那句话。请看我的最新答案。你的最新答案是我的选项3,不是吗?我不喜欢这个选项,因为它破坏了良好的列表代码的清晰性。这就是Psycopg人所说的一种合成查询字符串的幼稚


至少在我看来,这与选项相同_2@ssoler:您的选项_2在所有行上都有前导空格;请注意,您的示例省略了
select
之前的前导空格。我的答案没有前导空格。是什么导致你认为它们是一样的?如果你把你的sql字符串放在一个方法中,你将不得不把所有的行列成表格(选项2)。解决这个问题的一个可能的办法是选项3。@ssoler:对不起,我不明白那句话。请看我的最新答案。你的最新答案是我的选项3,不是吗?我不喜欢这个选项,因为它破坏了良好的列表代码的清晰性。这就是Psycopg人所说的一种合成查询字符串的幼稚方法,例如使用字符串连接。而是使用查询参数来避免SQL注入攻击,并自动将Python对象与SQL文本进行转换。这个问题实际上并不特定于SQL查询,但通常适用于在Python中格式化多行字符串。应该删除SQL标记。选项2-三重引号,并使用内置的
textwrap.dedent
输出到SQL文件或调试日志。如果这是为了打印,我认为更好的选择是使用
将其写入多行字符串,并使用
textwrap.dedent()
在输出之前,我使用了该选项,但它也使日志输出多行。当跟踪一个db聊天应用程序时,这会导致大量输出。这是一个旧线程,但我一直使用这种格式作为最佳实践,但是它对于较长的查询会变得单调乏味。我们不应该总是使用双引号
“sql查询吗“
为了避免弄乱SQL字符串(使用单引号作为标准)?如何格式化源代码是一个有效的问题,但在SQL上下文中,应该特别提到的是,变量的正确转义更为重要。使用字符串格式准备SQL语句是不安全的。请永远不要这样做。这叫做SQL注入,非常危险。几乎每个Python数据库库都提供了使用参数的工具。如果您发现自己在SQL字符串中使用
format()
,这是一种主要的代码气味。我不认为我们不能使用它,您必须在使用它之前验证参数,并且您应该知道传递的内容。验证比仅使用
where condition1=:field1
然后将值作为参数传递更容易出错。如果您使用的是
.format()
,将有一种方法弹出
”;将表用户
放到SQL中。查看PEP-249,了解如何正确使用参数。我建议在原始sql字符串前加上前缀“r”。请参阅下面我的答案中的详细信息。
def myquery():
    sql = "select field1, field2, field3, field4 from table where condition1=1 and condition2=2"
    con = mymodule.get_connection()
    ...
def query():
    sql = """
        select field1, field2, field3, field4
        from table
        where condition1=1
        and condition2=2"""
    con = mymodule.get_connection()
    ...
def query():
    sql = """select field1, field2, field3, field4
from table
where condition1=1
and condition2=2"""
    con = mymodule.get_connection()
    ...
def query():
    sql = "select field1, field2, field3, field4 " \
          "from table " \
          "where condition1=1 " \
          "and condition2=2 "
    con = mymodule.get_connection()    
    ...

sql = 'select %s from table where condition1=1 and condition2=2' % (
 ', '.join(fields))
sql = """\
select field1, field2, field3, field4
from table
where condition1=1
and condition2=2
"""
>>> class Foo:
...     def fubar(self):
...         sql = """\
... select *
... from frobozz
... where zorkmids > 10
... ;"""
...         print sql
...
>>> Foo().fubar()
select *
from frobozz
where zorkmids > 10
;
>>>
def debugLogSQL(sql):
     print ' '.join([line.strip() for line in sql.splitlines()]).strip()

sql = """
    select field1, field2, field3, field4
    from table"""
if debug:
    debugLogSQL(sql)
sql = ("SELECT field1, field2, field3, field4 "
       "FROM table "
       "WHERE condition1=1 "
       "AND condition2=2;")
fields = "field1, field2, field3, field4"
table = "table"
conditions = "condition1=1 AND condition2=2"

sql = (f"SELECT {fields} "
       f"FROM {table} "
       f"WHERE {conditions};")
sql = """
    SELECT field1, field2, field3, field4
      FROM table
     WHERE condition1 = 1
       AND condition2 = 2;
"""
sql = ("select field1, field2, field3, field4 "
       "from table "
       "where condition1={} "
       "and condition2={}").format(1, 2)

Output: 'select field1, field2, field3, field4 from table 
         where condition1=1 and condition2=2'
sql = ("select field1, field2, field3, field4 "
       "from table "
       "where condition1='{0}' "
       "and condition2='{1}'").format('2016-10-12', '2017-10-12')

Output: "select field1, field2, field3, field4 from table where
         condition1='2016-10-12' and condition2='2017-10-12'"
DROP PROCEDURE IF EXISTS example;
 DELIMITER //
 CREATE PROCEDURE example()
   BEGIN
   SELECT 2+222+2222+222+222+2222+2222 AS this_is_a_really_long_string_test;
   END //
 DELIMITER;

#calling the procedure gives you the result of whatever query you want to put in this procedure. You can actually process multiple queries within a procedure. The call just returns the last query result
 call example;
sql =('call example;')
from inspect import cleandoc
def query():
    sql = """
        select field1, field2, field3, field4
        from table
        where condition1=1
        and condition2=2
    """

    print("-"*40)
    print(sql)
    print("-"*40)
    print(cleandoc(sql))
    print("-"*40)

query()
----------------------------------------

        select field1, field2, field3, field4
        from table
        where condition1=1
        and condition2=2

----------------------------------------
select field1, field2, field3, field4
from table
where condition1=1
and condition2=2
----------------------------------------
>>> import sqlparse
>>> raw = 'select * from foo; select * from bar;'
>>> print(sqlparse.format(raw, reindent=True, keyword_case='upper'))
SELECT *
FROM foo;

SELECT *
FROM bar;
sql = r"""
    SELECT field1, field2, field3, field4
      FROM table
     WHERE condition1 = 1
       AND condition2 = 2;
"""