首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python SQL查询字符串格式设置

Python SQL查询字符串格式设置
EN

Stack Overflow用户
提问于 2011-03-09 17:20:09
回答 12查看 161.3K关注 0票数 116

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

选项1

代码语言:javascript
复制
def myquery():
    sql = "select field1, field2, field3, field4 from table where condition1=1 and condition2=2"
    con = mymodule.get_connection()
    ...

  • 这对于打印sql字符串很有用。
  • 如果字符串很长并且不适合80个字符的标准宽度,这不是一个好的解决方案。

选项2

代码语言:javascript
复制
def query():
    sql = """
        select field1, field2, field3, field4
        from table
        where condition1=1
        and condition2=2"""
    con = mymodule.get_connection()
    ...

这里的代码是清晰的,但是当你打印查询字符串时,你会得到所有这些讨厌的空格。

U‘\n选择\n_______and condition2=2',field1,field2,field3,condition1=1

注意:我已经用下划线``_替换了空格,因为编辑器会对它们进行修剪

选项3

代码语言:javascript
复制
def query():
    sql = """select field1, field2, field3, field4
from table
where condition1=1
and condition2=2"""
    con = mymodule.get_connection()
    ...

  • 我不喜欢这个选项,因为它破坏了列表良好的代码的清晰度。

选项4

代码语言:javascript
复制
def query():
    sql = "select field1, field2, field3, field4 " \
          "from table " \
          "where condition1=1 " \
          "and condition2=2 "
    con = mymodule.get_connection()    
    ...

  • 我不喜欢这个选项,因为每一行都需要额外的输入,而且编辑查询也很困难。

对我来说,最好的解决方案是SQLOption2SQL,但是我不喜欢在打印字符串时出现额外的空格。

你知道还有其他的选择吗?

EN

回答 12

Stack Overflow用户

回答已采纳

发布于 2012-02-24 23:42:21

很抱歉在这么老的帖子上发帖--但作为一个同样热衷于pythonic 'best‘的人,我想我应该分享我们的解决方案。

解决方案是使用python的字符串文字连接(http://docs.python.org/)构建SQL语句,它可以限定在选项2和选项4之间的某个位置。

代码示例:

代码语言:javascript
复制
sql = ("SELECT field1, field2, field3, field4 "
       "FROM table "
       "WHERE condition1=1 "
       "AND condition2=2;")

同样适用于f字符串

代码语言:javascript
复制
fields = "field1, field2, field3, field4"
table = "table"
conditions = "condition1=1 AND condition2=2"

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

优点:

  1. 它保留了pythonic式的“良好制表”格式,但没有添加无关的空格字符(这会污染日志记录)。SHIFT
  2. 它避免了选项4的反斜杠延续丑陋,这使得添加语句变得困难(更不用说空白blindness).
  3. And了,在VIM中展开语句真的很简单(只需将光标定位到插入点,然后按SHIFT-O组合键打开新行)。
票数 154
EN

Stack Overflow用户

发布于 2011-03-09 17:55:12

显然,您已经考虑了许多方法来编写SQL,使其能够正常打印,但是更改用于调试日志记录的'print‘语句,而不是以您不喜欢的方式编写SQL,怎么样?使用上面你最喜欢的选项,像这样的日志记录函数怎么样:

代码语言:javascript
复制
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)

如果行的长度超过您的期望长度,这也会使添加额外的逻辑来将记录的字符串拆分到多行中变得很简单。

票数 21
EN

Stack Overflow用户

发布于 2016-01-20 16:29:20

我遇到的最干净的方式是受到sql style guide的启发。

代码语言:javascript
复制
sql = """
    SELECT field1, field2, field3, field4
      FROM table
     WHERE condition1 = 1
       AND condition2 = 2;
"""

从本质上讲,子句开头的关键字应该右对齐,字段名等应该左对齐。这看起来非常整洁,也更容易调试。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5243596

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档