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.