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