python 中带有动态参数的数据库查询

Database Query with dynamic parameters in python

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

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

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

除了这部分,我的代码几乎完成了。已尝试 Python Dynamic Parameterized Query。 但它会抛出一些操作错误。我在这里使用 sqlite3。

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

将实际值作为元组传递:

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'] 文本替换为 %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)