如何根据 PEP8 格式化长 SQL 查询

How to format long SQL queries according to PEP8

根据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;")

怎么样

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

?使用 """''' 你会得到与很长的字符串相同的行为,但你可以很好地使用换行符。你的数据库也不会介意它们。

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

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 注入攻击并导致其他问题。

怎么样

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 符合 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;
""")