【问题标题】:How to format long SQL queries according to PEP8如何根据 PEP8 格式化长 SQL 查询
【发布时间】:2015-12-21 10:27:36
【问题描述】:

根据PEP 8 (Maximum Line Length),一行不应超过 79 个字符。

但是,当我尝试拆分查询时,我遇到了连续字符和无效标记等问题。

例如,根据 PEP8,格式化此查询的最佳方式是什么?

cursor.execute("SELECT pivot_id FROM aud_qty WHERE hshake1 is NULL AND ((strftime('%s', DATETIME('now')) - strftime('%s', sent_to_pivot)) / (60)) > 30;")

【问题讨论】:

  • 我相信这个问题值得更好的解释,关于例子和概念本身。也许长时间的 Pythonist 可以为这两种情况提供更清晰的愿景。我在 Quora 上打开了这个问题,以获得对该主题的更多解释:quora.com/unanswered/…

标签: python python-2.7 pep8


【解决方案1】:

通过这种方式,您可以获得符合 PEP8 准则的清晰 SQL 语句。

cursor.execute("""
    SELECT pivot_id
    FROM aud_qty
    WHERE hshake1 is NULL
        AND ((strftime('%s', DATETIME('now')) -
            strftime('%s', sent_to_pivot)) / (60)) > 30;
""")

【讨论】:

  • 阶段添加解释,以获取长期价值,并帮助其他人从这段代码中学习。只选择答案在 SO 上不受欢迎。例如,OP 不知道这个答案的重要部分是什么,它是如何解决问题的,等等。
【解决方案2】:

怎么样

from models import AudQty,session
update_limit = time.time()-30*60 # 30 minutes ago
session.query(AudQty.pivot_id).filter(hshake1=None,
                                sent_to_pivot_lte=update_limit).all()

字符串也可以是多行的,没有三引号,因为两个引号字符串彼此相邻会自动连接

cursor.execute("SELECT pivot_id FROM aud_qty " 
               "WHERE hshake1 is NULL AND "
               "((strftime('%s', DATETIME('now')) - strftime('%s', sent_to_pivot)) / (60)) > 30;")

【讨论】:

  • 你使用的是这个 SQL Alchemy 吗?
  • 是的,第一个例子是 sqlalchemy(我是个聪明人)
【解决方案3】:

您需要使用多行字符串。如果你只用一个"' 声明你的字符串,它将是一个单行字符串,要创建多行字符串,你需要用"""''' 包装你的字符串。这是一个例子:

sql_query = """SELECT pivot_id 
FROM aud_qty 
WHERE hshake1 is NULL AND 
    ((strftime('%s', DATETIME('now')) - strftime('%s', sent_to_pivot)) / (60)) > 30;"""

值得一提的是,手动创建 SQL 查询通常不是一个好主意,因为它可以启用 SQL 注入攻击并导致其他问题。

【讨论】:

    【解决方案4】:

    怎么样

    cursor.execute("""SELECT pivot_id
                        FROM aud_qty
                       WHERE hshake1 is NULL
                         AND ((strftime('%s', DATETIME('now')) -
                             strftime('%s', sent_to_pivot)) / (60)) > 30;
                   """)
    

    ?使用"""''' 可以获得与非常长的字符串相同的行为,但您可以使用换行符。而且您的数据库也不会介意它们。

    【讨论】:

    • 在运行此查询时,是否所有额外的空间都通过网络发送到数据库?这通常被认为可以忽略不计吗?
    猜你喜欢
    • 2020-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多