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:从带有变量的文件中调用查询的主要内容,如果未能解决你的问题,请参考以下文章

带有枚举的基本 python 文件-io 变量

从file.Python3将值变量插入sql查询

处理带有变量的 Graphql 查询时,Python 请求抛出 400

带有 SET 变量语句的 Mysqli 查询(在多个查询中)

Python读取文件-传递变量名[重复]

如何使用python 2.7从特定文件中读取环境变量