U moet voor elke waarde SQL-parameters gebruiken.
Voor de in statement, dat betekent dat u de volgende parameters moet genereren:
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))])
waarbij ik aanneem dat params3_value is een lijst met waarden om te testen params3 tegen. Als params3_value is 3 elementen (zoals ['v1', 'v2', 'v3'] ) dan ziet de gegenereerde SQL er als volgt uit:
select * from tbl where params1=:params1 and params2=:params2 and params3 in (:params3_0, :params3_1, :params3_2)
Geef die parameters dan door aan de cursor.execute() bel:
params = {'params1': params1_value, 'params2': params2_value}
for i, val in enumerate(params3_value):
params['params3_' + str(i)] = value
cursor.execute(sql, {params})
Ik gebruikte de :name hier de SQL-parameterstijl genoemd, want dat is wat de cx_Oracle toepassingen. Raadpleeg de documentatie van uw databaseconnector voor de exacte ondersteunde parameterstijlen.
De :named benoemde SQL-parameterstijl vereist dat u parameters doorgeeft als een woordenboek, dus de bovenstaande code genereert de juiste sleutels voor de params3_value artikelen.