Du bruger Python-strengformatering, og dette er en meget dårlig idé (TM). Tænk SQL-injektion. Den rigtige måde at gøre det på er at bruge bundne variable:
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))
hvor tuppelen af parametre er givet som andet argument til execute()
. Du behøver heller ikke undslippe nogen værdi, psycopg2 vil gøre det for dig. I dette særlige tilfælde foreslås det også ikke at videregive tabelnavnet i en variabel (escaped_name
), men for at indlejre det i forespørgselsstrengen:psycopg2 ved ikke, hvordan man citerer tabel- og kolonnenavne, kun værdier.
Se psycopg2 dokumentation:
https://www.psycopg.org/docs/usage.html#passing-parameters-to-sql-queries
Hvis du ønsker at generere SQL-sætningen programmatisk, er den sædvanlige måde at bruge Python-formatering til sætningen og variabel binding til argumenterne. For eksempel, hvis du har tabelnavnet i escaped_name
du kan gøre:
query = "INSERT INTO %s (col1, ...) VALUES (%%s, ...)" % escaped_name
curs.execute(query, args_tuple)
For at bruge pladsholdere i din forespørgsel skal du naturligvis citere enhver %
der introducerer et bundet argument i det første format.
Bemærk, at dette er sikkert hvis og kun hvis escaped_name
genereres ved, at din kode ignorerer ethvert eksternt input (for eksempel et tabelbasenavn og en tæller), men der er risiko for SQL-injektion, hvis du bruger data leveret af brugeren.