sql >> データベース >  >> RDS >> PostgreSQL

psycopg2 pythonライブラリを使用し、優れた変換タイプのツールを使用してSQL動的クエリを構築する

    テーブル名をパラメータとして渡そうとしています。 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インジェクションの簡単な方法です。上記のコードで非常に大雑把な引用を行いましたが、クライアントライブラリで提供されている場合は、適切な識別子引用関数を使用したいと思います。



    1. SQLServerのVARCHARおよびNVARCHARデータ型

    2. バックアップからMySQLまたはPostgresクラスターのデプロイを自動化する

    3. 30日より古い日付レコードを検索するOracleSQLWhere句

    4. ビジネス継続性のためのPostgreSQLの構成