sql >> Database >  >> RDS >> PostgreSQL

Psycopg2 Invoegen in tabel met tijdelijke aanduidingen

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.



  1. Datum- en tijdgegevens Bucketiseren

  2. Lopend totaal berekenen met OVER-clausule en PARTITION BY-clausule in SQL Server

  3. verander de kolom voor het neerzetten van tabellen in de Oracle-database

  4. SQL Server-controletabel gepartitioneerd