Próbujesz przekazać nazwę tabeli jako parametr. Prawdopodobnie mógłbyś to zobaczyć od razu, gdybyś tylko spojrzał na dziennik błędów PostgreSQL.
Nazwa tabeli, którą próbujesz przekazać przez psycopg2 jako parametr, jest zmieniana, tworząc zapytanie takie jak:
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)');'
To nie jest to, co zamierzałeś i nie zadziała; nie można uciec od nazwy tabeli jak literał. Aby skonstruować dynamiczny SQL, musisz użyć normalnej interpolacji łańcuchów Pythona, możesz używać tylko sparametryzowanych symboli zastępczych instrukcji dla rzeczywistych wartości literału.
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)
Zobacz, jak bezpośrednio interpolowałem nazwę, aby utworzyć ciąg zapytania:
INSERT INTO my_table(name, url, id, point_geom, poly_geom) VALUES (ST_GeomFromText(%s,%s));
(%%
zostaje przekonwertowany na zwykły %
przez procentową substytucję). Następnie używam tego zapytania z ciągiem definiującym POLYGON
i drugi argument do ST_GeomFromText
jako parametry zapytania.
Nie testowałem tego, ale powinno dać ci dobry pomysł i pomóc wyjaśnić, co jest nie tak.
ZACHOWAJ WYJĄTKOWĄ OSTROŻNOŚĆ wykonując taką interpolację ciągów, jest to łatwa droga do wstrzyknięcia SQL. Zrobiłem bardzo prymitywne cytowanie w powyższym kodzie, ale chciałbym użyć odpowiedniej funkcji cytowania identyfikatora, jeśli twoja biblioteka klienta ją oferuje.