Python:从带有变量的文件中调用查询
Posted
技术标签:
【中文标题】Python:从带有变量的文件中调用查询【英文标题】:Python: Calling queries from a file with variables 【发布时间】:2017-06-23 16:42:07 【问题描述】:我的 python 脚本中有一些查询也使用变量作为参数来检索数据。
'''SELECT * FROM order_projections_daily WHERE days >= ''' + each + '''AND days < ''' + next_monday
如何将这样的查询存储在单独的文件中并直接从那里调用,而不是将它们塞进代码中?
我尝试将查询存储在文件中并将它们作为字符串调用,但它不适用于变量。它适用于:
'''SELECT * FROM order_projections_daily'''
这是一个非常简单的查询,我在实际案例中使用了更复杂的查询。
【问题讨论】:
【参考方案1】:使用参数化字符串——
'''SELECT * FROM order_projections_daily WHERE days >= %(start)s AND days < %(end)s'''
稍后,在执行查询时,像这样构建一个参数dict
:
params = 'start': ..., 'end': ...
这些参数应该被传递给 DBC 驱动函数,该函数将负责插入参数:
cursor.execute(query, params)
注意:不要将格式字符串注入到您的查询中,您可能会以这种方式进行 SQL 注入。
【讨论】:
【参考方案2】:使用 python 字符串格式化。
在您单独的文件保存查询中,如下所示:
query = "select * from my_persons where name = name and age = age"
在 python 文件中,以这种方式格式化查询:
sql = query.format(name="jack", age=27)
您可以将所有查询作为字符串值保存在单独的 python 文件中,并将它们全部导入到您的代码中。在我的例子中,我假设查询保存在一个单独的 python 文件中。
格式化查询
query='''SELECT * FROM order_projections_daily WHERE days >=each AND days < next_monday
格式化为:
sql = query.format(each=each, next_monday=next_monday)
最好使用 format 方法或 % 或者甚至 join 而不是使用字符串连接,因为字符串连接会创建中间字符串对象。
好吧,那么格式化是个坏主意,看看这个。 oracle中的名称绑定https://***.com/a/33882805/2196290
【讨论】:
与其他答案一样,从不使用带有 SQL 查询的字符串格式来传递值。始终使用 DB-API 或 lib 的占位符。 像 oracle 查询中的名称绑定?以上是关于Python:从带有变量的文件中调用查询的主要内容,如果未能解决你的问题,请参考以下文章
处理带有变量的 Graphql 查询时,Python 请求抛出 400