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

Psycopg2 Einfügen in Tabelle mit Platzhaltern

Sie verwenden die Python-Zeichenfolgenformatierung und dies ist eine sehr schlechte Idee (TM). Denken Sie an SQL-Injection. Der richtige Weg, dies zu tun, ist die Verwendung von gebundenen Variablen:

cur.execute('INSERT INTO %s (day, elapsed_time, net_time, length, average_speed, geometry) VALUES (%s, %s, %s, %s, %s, %s)', (escaped_name, day, time_length, time_length_net, length_km, avg_speed, myLine_ppy))

wobei das Tupel von Parametern als zweites Argument für execute() angegeben wird . Außerdem müssen Sie keinen Wert entkommen, psycopg2 übernimmt das Entkommen für Sie. In diesem speziellen Fall wird auch empfohlen, den Tabellennamen nicht in einer Variablen zu übergeben (escaped_name ), aber um es in die Abfragezeichenfolge einzubetten:psycopg2 weiß nicht, wie man Tabellen- und Spaltennamen zitiert, sondern nur Werte.

Siehe psycopg2-Dokumentation:

https://www.psycopg.org/docs/usage.html#passing-parameters-to-sql-queries

Wenn Sie die SQL-Anweisung programmgesteuert generieren möchten, ist es üblich, die Python-Formatierung für die Anweisung und die Variablenbindung für die Argumente zu verwenden. Zum Beispiel, wenn Sie den Tabellennamen in escaped_name haben Sie können Folgendes tun:

query = "INSERT INTO %s (col1, ...) VALUES (%%s, ...)" % escaped_name
curs.execute(query, args_tuple)

Um Platzhalter in Ihrer Abfrage zu verwenden, müssen Sie natürlich alle % in Anführungszeichen setzen die ein gebundenes Argument im ersten Format einführen.

Beachten Sie, dass dies sicher ist wenn und nur wenn escaped_name wird von Ihrem Code generiert, der externe Eingaben ignoriert (z. B. einen Tabellenbasisnamen und einen Zähler), aber es besteht das Risiko einer SQL-Injection, wenn Sie vom Benutzer bereitgestellte Daten verwenden.