Опитвате се да предадете име на таблица като параметър. Вероятно бихте могли да видите това веднага, ако току-що бяхте погледнали журнала за грешки на PostgreSQL.
Името на таблицата, което се опитвате да прехвърлите през psycopg2 като параметър, се екранира, създавайки заявка като:
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)');'
Това не е това, което сте възнамерявали и няма да работи; не можете да избягате от име на таблица като литерал. Трябва да използвате нормална интерполация на низове на Python, за да конструирате динамичен SQL, можете да използвате само параметризирани заместители на изрази за действителни литерални стойности.
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)
Вижте как директно интерполирах името, за да произведа низа на заявката:
INSERT INTO my_table(name, url, id, point_geom, poly_geom) VALUES (ST_GeomFromText(%s,%s));
(%%
се преобразува в обикновен %
чрез % заместване). Тогава използвам тази заявка с низа, дефиниращ POLYGON
и другият аргумент към ST_GeomFromText
като параметри на заявката.
Не съм тествал това, но трябва да ви даде правилната идея и да ви помогне да обясните какво не е наред.
БЪДЕТЕ ИЗКЛЮЧИТЕЛНО ВНИМАТЕЛНИ когато правите интерполация на низ като тази, това е лесен път за SQL инжекция. Направих много грубо цитиране в кода, показан по-горе, но бих искал да използвам подходяща функция за цитиране на идентификатор, ако вашата клиентска библиотека предлага такава.