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

opbygge dynamisk SQL-forespørgsel med psycopg2 python-bibliotek og ved hjælp af gode konverteringsværktøjer

Du forsøger at sende et tabelnavn som en parameter. Du kunne sandsynligvis have set dette med det samme, hvis du bare havde kigget på PostgreSQL-fejlloggen.

Tabelnavnet, du forsøger at passere gennem psycopg2 som en parameter, bliver escaped, hvilket producerer en forespørgsel som:

  indsæt i e'my_table '(navn, url, id, point_geom, poly_geom) værdier (e'st_geomfromText (' 'Polygon ((52.146542 19.050557, 52.148430 19.045527, 52.149525 19.045831, 52.14474555555555555555555555555555555505550550555055505550555055505550555055505550555055555055505550550550550555055505550555055505550555 19.050557))'',4326)');' 

Dette er ikke, hvad du havde til hensigt og vil ikke virke; du kan ikke undslippe et tabelnavn som et bogstav. Du skal bruge normal Python-strenginterpolation til at konstruere dynamisk SQL. Du kan kun bruge parameteriserede sætningspladsholdere til faktiske bogstavelige værdier.

Params =('Polygon ((52.146542 19.050557, 52.148430 19.045527, 52.14,' )curs.execute('INSERT INTO "%s"(navn, url, id, point_geom, poly_geom) VALUES (ST_GeomFromText(%%s,%%s));' % escaped_name, params)

Se, hvordan jeg har interpoleret navnet direkte for at producere forespørgselsstrengen:

INSERT INTO my_table(navn, url, id, point_geom, poly_geom) VALUES (ST_GeomFromText(%s,%s)); 

(%% bliver konverteret til almindelig % ved % substitution). Så bruger jeg den forespørgsel med strengen, der definerer POLYGON og det andet argument til ST_GeomFromText som forespørgselsparametre.

Jeg har ikke testet dette, men det burde give dig den rigtige idé og hjælpe med at forklare, hvad der er galt.

VÆR YDERST FORSIGTIG når du laver strenginterpolation som denne, er det en nem vej til SQL-injektion. Jeg har lavet meget grove citater i koden vist ovenfor, men jeg vil gerne bruge en korrekt identifikationsciteringsfunktion, hvis dit klientbibliotek tilbyder en.



  1. Hvordan udskriver man VARCHAR(MAX) ved hjælp af Print Statement?

  2. script til at konvertere mysql dump sql-fil til format, der kan importeres til sqlite3 db

  3. Tanker om SQL Server 2019-udgaver

  4. MariaDB JSON_DEPTH() Forklaret