Brug venligst en parameteriseret forespørgsel som beskrevet i dokumenterne
Da du allerede har et diktat, kan du gøre:
sql_data_sample = """select * from %(table_name)s
where dt = %(date_from)s
and target in ('ACTIVE')
----------------------------------------------------
union all
----------------------------------------------------
(select * from %(table_name)s
where dt = %(date_to)s
and target in (%(class_target)s));"""
cur.execute(sql_data_sample, query_params)
Jeg har ikke testet, om det virker med en beordret diktat, men det synes jeg, det burde. Hvis ikke, kan du gøre dit bestilte diktat til et regulært diktat, før du sender det som parameterkortlægning.
REDIGER Medmindre du har brug for, at dine parametre skal være en OrderedDict senere, skal du bruge en almindelig dict. Så vidt jeg kan se, valgte du kun en OrderedDict for at bevare værdirækkefølgen for list(query_params.values())[0]
.
EDIT2 Tabelnavne og feltnavne kan ikke videregives ved hjælp af bindinger. Antoine Dusséaux påpegede i dette svar at psycopg2 tilbyder en mere eller mindre sikker måde at gøre det på siden version 2.7.
from psycopg2 import sql
sql_data_sample = """select * from {0}
where dt = %(date_from)s
and target in ('ACTIVE')
----------------------------------------------------
union all
----------------------------------------------------
(select * from {0}
where dt = %(date_to)s
and target in (%(class_target)s));"""
cur.execute(sql.SQL(sql_data_sample)
.format(sql.Identifier(query_params['table_name'])),
query_params)
Du skal muligvis fjerne table_name
fra din dict, er jeg ikke sikker på, hvordan psycopg2 reagerer på yderligere elementer i parametrene dict, og jeg kan ikke teste det lige nu.
Det skal påpeges, at dette stadig udgør en risiko for SQL-injektion og bør undgås, medmindre det er absolut nødvendigt. Normalt er tabel- og feltnavne en ret fast del af en forespørgselsstreng.
Her er den relevante dokumentation til sql
modul
.