psycopg2がパラメータ化されたクエリをPostgreSQLに渡すようにするための最良の方法は何ですか?独自のescpaingメカニズムやアダプターを作成したくないので、psycopg2のソースコードと例をWebブラウザーで読み取るのは困難です。
PyGreSQLや別のpythonpgアダプターなどに切り替える必要がある場合は、それで問題ありません。単純なパラメーター化が必要です。
psycopg2がパラメータ化されたクエリをPostgreSQLに渡すようにするための最良の方法は何ですか?独自のescpaingメカニズムやアダプターを作成したくないので、psycopg2のソースコードと例をWebブラウザーで読み取るのは困難です。
PyGreSQLや別のpythonpgアダプターなどに切り替える必要がある場合は、それで問題ありません。単純なパラメーター化が必要です。
psycopg2
DB-API 2.0のルールに従います(PEP-249で設定)。つまり、オブジェクトexecute
からメソッドを呼び出してバインディングスタイルを使用すると、エスケープが実行されます。たとえば、次のものは安全である(そして機能する)必要があります。cursor
pyformat
cursor.execute("SELECT * FROM student WHERE last_name = %(lname)s",
{"lname": "Robert'); DROP TABLE students;--"})
psycopgドキュメントから
(http://initd.org/psycopg/docs/usage.html)
警告決して、決して、決して、Python文字列連結(+)または文字列パラメーター補間(%)を使用して変数をSQLクエリ文字列に渡すことは絶対にしないでください。銃を突きつけても。
SQLコマンドで変数を渡す正しい方法は、execute()メソッドの2番目の引数を使用することです。
SQL = "INSERT INTO authors (name) VALUES (%s);" # Note: no quotes
data = ("O'Reilly", )
cur.execute(SQL, data) # Note: no % operator
ここにあなたが役立つかもしれないいくつかの例があります
cursor.execute('SELECT * from table where id = %(some_id)d', {'some_id': 1234})
または、フィールド名、値のdictに基づいてクエリを動的に構築できます。
fields = ', '.join(my_dict.keys())
values = ', '.join(['%%(%s)s' % x for x in my_dict])
query = 'INSERT INTO some_table (%s) VALUES (%s)' % (fields, values)
cursor.execute(query, my_dict)
注:フィールドは、ユーザー入力ではなくコードで定義する必要があります。そうしないと、SQLインジェクションの影響を受けやすくなります。