python - 在python中使用动态参数进行数据库查询
问题描述
我正在构建一个代码来使用 python 查询数据库。输入来自字典。我已经编写了用于在查询中传递一个参数(键)的代码,
cursor = conn.execute("SELECT * FROM table1 WHERE param = '%s'" % kwargs['param'])
我要传递给这一行的字典项目计数可能会有所不同。因此,在WHERE之后需要编写代码来查询字典的所有键到数据库。
除了这部分,我的代码几乎完成了。尝试过Python 动态参数化查询。但它会引发一些操作错误。我在这里使用 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']
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)
推荐阅读
- android - 以编程方式使用 Amazon pinpiont 发送推送通知
- ckeditor - 在 CKEditor 中选择可编辑节点内的文本
- sql-server - 如何在mac上使用docker连接sql server?
- javascript - 以下代码是否容易受到基于 dom 的 xss 的攻击?
- android - 房间查询返回列子集时出错
- php - Woocommerce 从购物车商品计数中删除 free_gift
- c - 从传递给符合 MISRA 规则 17.4 的函数的 void 指针参数访问所有数组元素
- .htaccess - 如何将目录重写为查询字符串
- scala - 将 Apache Flink 中的关系数据作为 State 存储并通过属性进行查询
- php - 在 php 中的键值对象中添加数据