U probeert een tabelnaam als parameter door te geven. Je had dit waarschijnlijk meteen kunnen zien als je naar het PostgreSQL-foutlogboek had gekeken.
De tabelnaam die u als parameter door psycopg2 probeert te geven, wordt geëscaped, waardoor een query wordt geproduceerd als:
INSERT INTO E'my_table'(name, url, id, point_geom, poly_geom) VALUES (E'ST_GeomFromText(''POLYGON(( 52.146542 19.050557, 52.148430 19.045527, 52.149525 19.045831, 52.147400 19.050780, 52.147400 19.050780, 52.146542 19.050557))'',4326)');'
Dit is niet wat je bedoelde en zal niet werken; je kunt niet ontsnappen aan een tabelnaam zoals een letterlijke. U moet normale Python-tekenreeksinterpolatie gebruiken om dynamische SQL te construeren, u kunt alleen tijdelijke aanduidingen voor geparametriseerde instructies gebruiken voor werkelijke letterlijke waarden.
params = ('POLYGON(( 52.146542 19.050557, 52.148430 19.045527, 52.149525 19.045831, 52.147400 19.050780, 52.147400 19.050780, 52.146542 19.050557))',4326)
escaped_name = name.replace('"",'""')
curs.execute('INSERT INTO "%s"(name, url, id, point_geom, poly_geom) VALUES (ST_GeomFromText(%%s,%%s));' % escaped_name, params)
Zie hoe ik de naam rechtstreeks heb geïnterpoleerd om de queryreeks te produceren:
INSERT INTO my_table(name, url, id, point_geom, poly_geom) VALUES (ST_GeomFromText(%s,%s));
(%%
wordt geconverteerd naar gewoon %
door % substitutie). Dan gebruik ik die query met de tekenreeks die de POLYGON
. definieert en het andere argument voor ST_GeomFromText
als queryparameters.
Ik heb dit niet getest, maar het zou je het juiste idee moeten geven en helpen verklaren wat er mis is.
WEES UITERST VOORZICHTIG wanneer stringinterpolatie op deze manier wordt uitgevoerd, is het een gemakkelijke manier voor SQL-injectie. Ik heb heel grof geciteerd in de hierboven getoonde code, maar ik zou een goede identificatiefunctie willen gebruiken als uw klantenbibliotheek er een biedt.