作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
点赞这个问题passing-param-to-db-execute-for-where-in-int-list
但是多了where条件,怎么处理呢?
select * from tbl where params1='p1' and params2='p2' and params3 in ('v1', 'v2', v3')
如果我想使用 Python DB API 将 params1、params2、params3 传递给 SQL 语句,有什么建议吗?
顺便说一句:数据库是 Oracle
最佳答案
您需要为每个值使用 SQL 参数。
对于 in
语句,这意味着您需要生成参数:
sql = 'select * from tbl where params1=:params1 and params2=:params2 and params3 in ({})'.format(
', '.join(['params3_' + str(i) for i in range(len(params3_value))])
我假设 params3_value
是用于测试 params3
的值列表。如果 params3_value
是 3 个元素(如 ['v1', 'v2', 'v3']
),那么生成的 SQL 将如下所示:
select * from tbl where params1=:params1 and params2=:params2 and params3 in (:params3_0, :params3_1, :params3_2)
然后将这些参数传递给 cursor.execute()
调用:
params = {'params1': params1_value, 'params2': params2_value}
for i, val in enumerate(params3_value):
params['params3_' + str(i)] = value
cursor.execute(sql, {params})
我在这里使用了 :name
命名的 SQL 参数样式,因为这是 cx_Oracle
使用的。请查阅您的数据库连接器文档以了解确切支持的参数样式。
:named
命名的 SQL 参数样式要求您将参数作为字典传入,因此上面的代码为 params3_value
项生成了正确的键。
关于python - 数据库 API : How to deal with multi where condition in Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19043987/
我是一名优秀的程序员,十分优秀!