Anda mencoba memberikan nama tabel sebagai parameter. Anda mungkin bisa langsung melihat ini jika Anda baru saja melihat log kesalahan PostgreSQL.
Nama tabel yang Anda coba lewati psycopg2 sebagai parameter sedang diloloskan, menghasilkan kueri seperti:
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)');'
Ini bukan yang Anda maksudkan dan tidak akan berhasil; anda tidak dapat menghindari nama tabel seperti literal. Anda harus menggunakan interpolasi string Python normal untuk membuat SQL dinamis, Anda hanya dapat menggunakan placeholder pernyataan berparameter untuk nilai literal aktual.
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)
Lihat bagaimana saya menginterpolasi nama secara langsung untuk menghasilkan string kueri:
INSERT INTO my_table(name, url, id, point_geom, poly_geom) VALUES (ST_GeomFromText(%s,%s));
(%%
akan dikonversi menjadi %
plain biasa dengan % substitusi). Lalu saya menggunakan kueri itu dengan string yang mendefinisikan POLYGON
dan argumen lainnya untuk ST_GeomFromText
sebagai parameter kueri.
Saya belum menguji ini, tetapi ini akan memberi Anda ide yang benar dan membantu menjelaskan apa yang salah.
SANGAT HATI-HATI ketika melakukan interpolasi string seperti ini, ini adalah jalan yang mudah untuk injeksi SQL. Saya telah melakukan kutipan yang sangat kasar dalam kode yang ditunjukkan di atas, tetapi saya ingin menggunakan fungsi kutipan pengenal yang tepat jika perpustakaan klien Anda menawarkannya.