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']])
注:
%s
参数周围没有引号 '
。
%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)
我正在构建代码以使用 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']])
注:
%s
参数周围没有引号'
。%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)