如何根据PEP8规范格式化长的SQL查询语句

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

1
我认为这个问题值得更好的解释,包括示例和概念本身。也许一些长期从事Python编程的人可以为这两种情况提供更清晰的视野。我在Quora上发布了这个问题,以便获取更多关于这个主题的解释:https://www.quora.com/unanswered/How-can-I-respect-PEP-8-Maximum-Line-Length-79-characters-for-SQL-queries-without-causing-issues-to-my-code - ivanleoncz
4个回答

17

怎么样?

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

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


运行此查询时,所有额外的空格是否都会通过网络发送到数据库?这通常被认为是可以忽略不计的吗? - avatarofhope2

3

使用这种方法,您将得到一个清晰易懂的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;
""")

1
为了长期价值和帮助他人学习此代码,请在回答中添加解释。在SO上,只选择有用的答案。例如,这个答案的重要部分是什么,OP不知道的是什么,它如何解决问题等。 - SherylHohman

2

您需要使用多行字符串。如果您只使用一个"'声明字符串,则它将成为单行字符串,要创建多行字符串,您需要用"""'''包装您的字符串。以下是一个示例:

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

0

怎么样?

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吗? - flybonzai
1
是的,第一个例子是SQLAlchemy(我有点聪明)。 - Joran Beasley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接