数据库API:如何处理Python中的多个where条件

时间:2013-09-27 06:22:26

标签: python database oracle

喜欢这个问题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

1 个答案:

答案 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项生成正确的密钥。