sql >> Database teknologi >  >> RDS >> PostgreSQL

Psycopg2 Indsæt i tabel med pladsholdere

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.



  1. Forbinder PostgreSQL 9.2.1 med Hibernate

  2. SQL ROWNUM hvordan man returnerer rækker mellem et specifikt område

  3. Konverter Datetime-kolonnen fra UTC til lokal tid i select statement

  4. Grunde til at forvandle Access Apps til webbaserede apps