作为记录,我使用的是Python和SQLlite。我有一个生成所需SQL的工作函数,但它似乎不正确。
def daily(self, host=None, day=None):
sql = "SELECT * FROM daily WHERE 1"
if host:
sql += " AND host = '%s'" % (host,)
if day:
sql += " AND day = '%s'" % (day,)
return sql
以后可能需要添加多个列和条件。
有更好的主意吗?
编辑: 看起来不对的是,我正在从字符串动态地构造SQL。这通常不是最好的方法。SQL注入attacs,需要正确转义字符串。我不能使用占位符,因为有些值是None,不需要在WHERE子句条件中。
只是为了完整。我发现pypika库非常方便(如果允许的话):
https://pypika.readthedocs.io/en/latest/index.html
它允许构造如下sql查询:
您确实不想使用字符串格式来包含值。通过SQL参数将其留给数据库API。
使用参数可以:
由于SQLLitesupports named SQL parameters,我将返回一个语句和一个带参数的字典:
然后将两个传递到
cursor.execute()
:SQL生成变得复杂,您可能需要查看SQLAlchemy core来代替生成。
例如,可以生成:
query
对象可以应用其他过滤器,对其进行排序、分组、用作其他查询的子选择、联接并最终发送以执行,此时SQLAlchemy会将其转换为适合您连接到的特定数据库的SQL。相关问题 更多 >
编程相关推荐