1

像这个问题将参数传递到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

4

1 回答 1

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

于 2013-09-27T06:25:37.383 回答