61

psycopg2がパラメータ化されたクエリをPostgreSQLに渡すようにするための最良の方法は何ですか?独自のescpaingメカニズムやアダプターを作成したくないので、psycopg2のソースコードと例をWebブラウザーで読み取るのは困難です。

PyGreSQLや別のpythonpgアダプターなどに切り替える必要がある場合は、それで問題ありません。単純なパラメーター化が必要です。

4

3 に答える 3

120

psycopg2DB-API 2.0のルールに従います(PEP-249で設定)。つまり、オブジェクトexecuteからメソッドを呼び出してバインディングスタイルを使用すると、エスケープが実行されます。たとえば、次のものは安全である(そして機能する)必要がありますcursorpyformat

cursor.execute("SELECT * FROM student WHERE last_name = %(lname)s", 
               {"lname": "Robert'); DROP TABLE students;--"})
于 2009-09-24T11:47:49.357 に答える
34

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

于 2015-09-23T15:11:13.990 に答える
4

ここにあなたが役立つかもしれないいくつかの例があります

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インジェクションの影響を受けやすくなります。

于 2009-09-23T18:59:40.533 に答える