テーブル名をパラメータとして渡そうとしています。 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)');'
これはあなたが意図したものではなく、機能しません。リテラルのようにテーブル名をエスケープすることはできません。動的SQLを構築するには、通常のPython文字列補間を使用する必要があります。実際のリテラル値には、パラメーター化されたステートメントプレースホルダーのみを使用できます。
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インジェクションの簡単な方法です。上記のコードで非常に大雑把な引用を行いましたが、クライアントライブラリで提供されている場合は、適切な識別子引用関数を使用したいと思います。