U gebruikt de opmaak van Python-tekenreeksen en dit is een zeer slecht idee (TM). Denk aan SQL-injectie. De juiste manier om dit te doen is door gebonden variabelen te gebruiken:
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))
waarbij het tupel van parameters wordt gegeven als tweede argument voor execute()
. U hoeft ook geen waarde te escapen, psycopg2 zal de escape voor u doen. In dit specifieke geval wordt ook aangeraden om de tabelnaam niet door te geven in een variabele (escaped_name
) maar om het in de queryreeks in te sluiten:psycopg2 weet niet hoe tabel- en kolomnamen moeten worden geciteerd, alleen waarden.
Zie psycopg2-documentatie:
https://www.psycopg.org/docs/usage.html#passing-parameters-to-sql-queries
Als u de SQL-instructie programmatisch wilt genereren, is de gebruikelijke manier om Python-opmaak te gebruiken voor de instructie en variabele binding voor de argumenten. Als u bijvoorbeeld de tabelnaam in escaped_name
je kunt doen:
query = "INSERT INTO %s (col1, ...) VALUES (%%s, ...)" % escaped_name
curs.execute(query, args_tuple)
Om tijdelijke aanduidingen in uw zoekopdracht te gebruiken, moet u uiteraard een %
. citeren die een gebonden argument in het eerste formaat introduceren.
Merk op dat dit veilig is als en alleen als escaped_name
wordt gegenereerd door uw code waarbij externe invoer wordt genegeerd (bijvoorbeeld een tabelnaam en een teller), maar er bestaat een risico op SQL-injectie als u gegevens gebruikt die door de gebruiker zijn verstrekt.