sql >> Database teknologi >  >> RDS >> PostgreSQL

Brug af en ordbog til at overføre parametre til postgresql-sætning i python

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 .



  1. Tilføjelse af en unik id-kolonne og tilføjelse af standarden for at generere ny guide

  2. Tilføj en ny tabelkolonne til specifik ordensposition i Microsoft SQL Server

  3. UML-notation

  4. Forespørgsel for at finde fremmednøgler