首页 > 解决方案 > 在python中使用动态参数进行数据库查询

问题描述

我正在构建一个代码来使用 python 查询数据库。输入来自字典。我已经编写了用于在查询中传递一个参数(键)的代码,

cursor = conn.execute("SELECT * FROM table1 WHERE param = '%s'" % kwargs['param'])

我要传递给这一行的字典项目计数可能会有所不同。因此,在WHERE之后需要编写代码来查询字典的所有键到数据库。

除了这部分,我的代码几乎完成了。尝试过Python 动态参数化查询。但它会引发一些操作错误。我在这里使用 sqlite3。

标签: pythonsqlparameterized-query

解决方案


如果没有看到错误消息,我无法确定错误是什么。但是您没有进行参数化查询。您想要进行查询的方式如下:

将实际值作为元组传递:

cursor = conn.execute("SELECT * FROM table1 WHERE param = %s", (kwargs['param'],))

或将实际值作为列表传递:

cursor = conn.execute("SELECT * FROM table1 WHERE param = %s", [kwargs['param']])

笔记:

  1. 参数'周围没有引号 , 。%s
  2. 参数的实际值以%s列表或元组的形式提供。

请注意,在元组中传递实际值时,元组被指定为(kwargs['param'],). 表达式(kwargs['param'])(不带逗号)将被解释为一个带有括号的简单术语,而不是一个元组,因此当您只有一个值时,末尾的逗号是必需的。

您正在对kwargs['param']for进行文本替换,%s然后用引号将结果括起来,这是完全不同的(如果kwargs['param']包含单引号怎么办?)。并且根据 的来源kwargs['param'],您可能会面临 SQL 注入攻击(您应该调查这个主题)。

更新

如果您有一个字典,kwargs其键是要在子句中使用的列的名称WHERE,例如:

kwargs = {'param1': 1, 'param2': 'a', 'param3': 'x'}

然后:

>>> kwargs = {'param1': 1, 'param2': 'a', 'param3': 'x'}
>>> where_clause = 'WHERE ' + ' AND '.join(['`' + k + '` = %s' for k in kwargs.keys()])
>>> where_clause
'WHERE `param1` = %s AND `param2` = %s AND `param3` = %s'
>>> values = list(kwargs.values())
>>> values
[1, 'a', 'x']

所以我们得到:

where_clause = 'WHERE ' + ' AND '.join(['`' + k + '` = %s' for k in kwargs.keys()])
values = list(kwargs.values())
sql = "SELECT * FROM table1 " + where_clause
cursor.execute(sql, values)

推荐阅读