sql >> Database >  >> RDS >> PostgreSQL

Een woordenboek gebruiken om parameters door te geven aan de postgresql-instructie in python

Gebruik een geparametriseerde query zoals beschreven in de documenten

Aangezien je al een dictaat hebt, kun je het volgende doen:

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)

Ik heb niet getest of het werkt met een geordend dictaat, maar ik denk dat het zou moeten. Als dat niet het geval is, kunt u van uw bestelde dictaat een normaal dictaat maken voordat u het doorgeeft als parametertoewijzing.

BEWERKEN Gebruik een gewoon dictaat, tenzij u uw parameters later nodig hebt om een ​​OrderedDict te zijn. Voor zover ik kan zien, heb je alleen gekozen voor een OrderedDict om de waardevolgorde voor de list(query_params.values())[0] te behouden .

EDIT2 Tabelnamen en veldnamen kunnen niet worden doorgegeven met behulp van bindingen. Antoine Dusséaux wees erop in dit antwoord dat psycopg2 een min of meer veilige manier biedt om dat te doen sinds versie 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)

Mogelijk moet u de table_name . verwijderen uit je dictaat weet ik niet zeker hoe psycopg2 reageert op aanvullende items in het parameters-dict en ik kan het nu niet testen.

Er moet op worden gewezen dat dit nog steeds het risico van SQL-injectie met zich meebrengt en moet worden vermeden, tenzij absoluut noodzakelijk. Normaal gesproken zijn tabel- en veldnamen een vrij vast onderdeel van een queryreeks.

Hier is de relevante documentatie voor de sql module .



  1. Deelnemen aan tabellen van twee verschillende servers

  2. SQL AND-operator voor beginners

  3. Hoe Asind() werkt in PostgreSQL

  4. Is er een goede manier om een ​​SQL-dump van de MySQL-database in DataGrip uit te voeren?