像这个问题将参数传递到db-execute-for-where-in-int-list
但更何况条件,如何处理呢?
select * from tbl where params1='p1' and params2='p2' and params3 in ('v1', 'v2', v3')
如果我想使用Python DB API将 params1、params2、params3 传递给 SQL 语句,有什么建议吗?
顺便说一句:数据库是 Oracle
像这个问题将参数传递到db-execute-for-where-in-int-list
但更何况条件,如何处理呢?
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
。