Python SQL 查询字符串格式化
我在寻找格式化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};")
优点:
- 它保持了python的“良好排版”格式,但不会添加多余的空格字符(这会影响日志的清晰度)。
- 它避免了选项4中反斜杠续行的丑陋写法,这让添加语句变得困难(更不用说会让人看不清空格了)。
- 而且,在VIM中扩展语句也非常简单(只需将光标放到插入点,然后按SHIFT-O打开新的一行)。