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



根据PEP 8(最大行长度),一行不应超过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;
               """)

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

这样你就有了一个符合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;
""")

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

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

最新更新