sql >> Databasteknik >  >> RDS >> PostgreSQL

Psycopg2 Infoga i tabell med platshållare

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.



  1. INFOGA en SELECT GROUP BY :fler målkolumner än uttrycksfel

  2. Arbeta med MySQL-databasmotorer

  3. SQL, hur sammanfogar man resultat?

  4. Jämför datum lagrade som sträng med Datetime