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

SQLクエリパラメータを指定したpsycopg2cursor.execute()により、構文エラーが発生します

    このようなパラメータ化されたステートメントは、で使用することを意図していると思います。 テーブル名(またはSQLキーワードなど)ではありません。ですから、基本的にこれでは運が悪いのです。

    ただし、このメカニズムはSQLインジェクションを防ぐことを目的としており、通常はコード作成時にアクセスするテーブルがわかっているため、誰かが悪意のあるコードをインジェクションする可能性はほとんどありません。先に進んで、文字列にテーブルを書き込んでください。

    何らかの(おそらくひねくれた)理由で、テーブル名を次のようにパラメトリックに保つ場合:

    1. テーブル名がプログラム(辞書やクラス属性など)に由来する場合は、通常の文字列置換を行います。
    2. テーブル名が外部からのものである場合(「ユーザー入力」と考えてください):そうしないか、ユーザーを完全に信頼して前のアプローチ1を適用します。

    例:

    cursor.execute(
        'SELECT * FROM %s where %s = %s'
        % ("my_table", "colum_name", "%s"), #1
        ("'some;perverse'string;--drop table foobar")) #2
    

    #1 :この時点で3番目の%sを別の'%s'に置き換えて、後でpsycopg2 #2で処理できるようにします。 :これは、psycopg2によって適切に引用され、元の文字列の3番目の「%s」の代わりに配置される文字列です



    1. MySQLで英語以外の文字を注文する

    2. SQL Serverデータベース(T-SQL)にログファイルを追加する方法

    3. レーベンシュタイン:MySQL + PHP

    4. SQLは日時を変換し、時間を減算します