PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Verwenden eines Wörterbuchs zum Übergeben von Parametern an die Postgresql-Anweisung in Python

Bitte verwenden Sie eine parametrisierte Abfrage, wie in den Dokumenten beschrieben

Da Sie bereits ein Diktat haben, könnten Sie Folgendes tun:

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)

Ich habe nicht getestet, ob if mit einem odered dict funktioniert, aber ich denke, es sollte. Wenn nicht, könnten Sie Ihr bestelltes Diktat zu einem regulären Diktat machen, bevor Sie es als Parameterzuordnung weitergeben.

BEARBEITEN Verwenden Sie ein normales Diktat, es sei denn, Ihre Parameter müssen später ein OrderedDict sein. Soweit ich sehen kann, haben Sie sich nur für ein OrderedDict entschieden, um die Wertereihenfolge für list(query_params.values())[0] beizubehalten .

BEARBEITEN2 Tabellennamen und Feldnamen können nicht über Bindungen übergeben werden. Antoine Dusséaux wies in dieser Antwort darauf hin dass psycopg2 seit Version 2.7 einen mehr oder weniger sicheren Weg dafür bietet.

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)

Möglicherweise müssen Sie den table_name entfernen Aus Ihrem Diktat bin ich mir nicht sicher, wie psycopg2 auf zusätzliche Elemente im Parameter-Diktat reagiert, und ich kann es derzeit nicht testen.

Es sollte darauf hingewiesen werden, dass dies immer noch das Risiko einer SQL-Injektion birgt und vermieden werden sollte, sofern nicht unbedingt erforderlich. Normalerweise sind Tabellen- und Feldnamen ein ziemlich fester Bestandteil eines Abfragestrings.

Hier ist die relevante Dokumentation für sql Modul .