喜欢这个问题passing-param-to-db-execute-for-where-in-int-list
但更多的条件,如何处理它?</ p>
select * from tbl where params1='p1' and params2='p2' and params3 in ('v1', 'v2', v3')
如果我想使用Python DB API将params1,params2,params3传递给SQL语句,有什么建议吗?
BTW:数据库是Oracle
答案 0 :(得分:3)
您需要为每个值使用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
项生成正确的密钥。