Python SQL 查询字符串格式化

141 投票
15 回答
250430 浏览
提问于 2025-04-16 13:19

我在寻找格式化SQL查询字符串的最佳方法。当我调试我的应用程序时,我希望将所有的SQL查询字符串记录到文件中,而字符串的格式化很重要。

选项 1

def myquery():
    sql = "select field1, field2, field3, field4 from table where condition1=1 and condition2=2"
    con = mymodule.get_connection()
    ...
  • 这个方法适合打印SQL字符串。
  • 但是如果字符串很长,超过了标准的80个字符宽度,这个方法就不太好用了。

选项 2

def query():
    sql = """
        select field1, field2, field3, field4
        from table
        where condition1=1
        and condition2=2"""
    con = mymodule.get_connection()
    ...
  • 这里的代码很清晰,但当你打印SQL查询字符串时,会出现很多烦人的空格。

    u'\nselect field1, field2, field3, field4\n_____from table\n____where condition1=1 \n_____and condition2=2'

注意:我用下划线_替换了空格,因为编辑器会自动去掉它们

选项 3

def query():
    sql = """select field1, field2, field3, field4
from table
where condition1=1
and condition2=2"""
    con = mymodule.get_connection()
    ...
  • 我不喜欢这个选项,因为它破坏了代码的清晰性,导致排版不整齐。

选项 4

def query():
    sql = "select field1, field2, field3, field4 " \
          "from table " \
          "where condition1=1 " \
          "and condition2=2 "
    con = mymodule.get_connection()    
    ...
  • 我也不喜欢这个选项,因为每行都要额外输入很多内容,而且编辑查询也很麻烦。

对我来说,最好的解决方案是选项 2,但我不喜欢打印SQL字符串时出现的多余空格。

你知道还有其他选项吗?

15 个回答

17

我遇到的最简洁的方法是受到SQL风格指南的启发。

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

简单来说,开始一个语句的关键词应该靠右对齐,而字段名称等则应该靠左对齐。这样看起来非常整齐,也更容易调试。

23

你显然考虑了很多种写SQL的方法,以便它能正常输出,但为什么不考虑改变你用来调试记录的'print'语句呢?与其用你不喜欢的方式写SQL,不如试试你喜欢的选项,比如下面这个记录函数:

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)

这样做还可以很简单地添加额外的逻辑,如果记录的字符串超过你想要的长度,就可以把它分成多行输出。

191

抱歉在这么老的帖子里发言——但作为一个同样热爱python最佳实践的人,我想分享一下我们的解决方案。

这个解决方案是用python的字符串字面量连接来构建SQL语句,这可以算是介于选项2和选项4之间的一种方法。

代码示例:

sql = ("SELECT field1, field2, field3, field4 "
       "FROM table "
       "WHERE condition1=1 "
       "AND condition2=2;")

使用f-strings也能很好地工作:

fields = "field1, field2, field3, field4"
table = "table"
conditions = "condition1=1 AND condition2=2"

sql = (f"SELECT {fields} "
       f"FROM {table} "
       f"WHERE {conditions};")

优点:

  1. 它保持了python的“良好排版”格式,但不会添加多余的空格字符(这会影响日志的清晰度)。
  2. 它避免了选项4中反斜杠续行的丑陋写法,这让添加语句变得困难(更不用说会让人看不清空格了)。
  3. 而且,在VIM中扩展语句也非常简单(只需将光标放到插入点,然后按SHIFT-O打开新的一行)。

撰写回答