Du använder Python-strängformatering och detta är en mycket dålig idé (TM). Tänk SQL-injektion. Det rätta sättet att göra det är att använda bundna variabler:
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))
där tupeln av parametrar ges som andra argument till execute()
. Du behöver inte heller undkomma något värde, psycopg2 kommer att göra det åt dig. I det här specifika fallet föreslås också att inte skicka tabellnamnet i en variabel (escaped_name
) men för att bädda in den i frågesträngen:psycopg2 vet inte hur man citerar tabell- och kolumnnamn, bara värden.
Se psycopg2-dokumentationen:
https://www.psycopg.org/docs/usage.html#passing-parameters-to-sql-queries
Om du vill generera SQL-satsen programmatiskt är det vanliga sättet att använda Python-formatering för satsen och variabelbindning för argumenten. Till exempel, om du har tabellnamnet i escaped_name
du kan göra:
query = "INSERT INTO %s (col1, ...) VALUES (%%s, ...)" % escaped_name
curs.execute(query, args_tuple)
För att använda platshållare i din fråga måste du naturligtvis citera någon %
som introducerar ett bundet argument i det första formatet.
Observera att detta är säkert om och bara om escaped_name
genereras genom att din kod ignorerar eventuell extern inmatning (till exempel ett tabellbasnamn och en räknare) men det finns risk för SQL-injektion om du använder data från användaren.