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.