sql >> Databáze >  >> RDS >> PostgreSQL

Použití slovníku k předání parametrů příkazu postgresql v pythonu

Použijte prosím parametrizovaný dotaz, jak je popsáno v dokumentech

Protože již máte diktát, můžete udělat:

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)

Netestoval jsem, jestli if funguje s odered dict, ale myslím, že by měl. Pokud ne, můžete z vašeho objednaného diktátu udělat běžný diktát, než jej předáte jako mapování parametrů.

UPRAVIT Pokud později nepotřebujete, aby vaše parametry byly OrderedDict, použijte běžný diktát. Pokud vidím, rozhodli jste se pouze pro OrderedDict, abyste zachovali pořadí hodnot pro list(query_params.values())[0] .

UPRAVIT2 Názvy tabulek a názvy polí nelze předávat pomocí vazeb. Antoine Dusséaux poukázal v této odpovědi že psycopg2 nabízí víceméně bezpečný způsob, jak toho dosáhnout od verze 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)

Možná budete muset odstranit table_name z vašeho dictu si nejsem jistý, jak psycopg2 reaguje na další položky v parametrech dict a nemohu to teď otestovat.

Je třeba zdůraznit, že to stále představuje riziko injekce SQL a je třeba se tomu vyhnout, pokud to není nezbytně nutné. Normálně jsou názvy tabulek a polí spíše pevnou součástí řetězce dotazu.

Zde je relevantní dokumentace pro sql modul .



  1. Co je SQL Server? (Definice, verze, edice)

  2. Entity Framework Code First MaxLength a FixedLegth (char vs varchar)

  3. doba provádění mysql

  4. substr nefunguje dobře s utf8