18

psycopg を介して PostgreSQL データベースと対話する Python コードがあります。

すべての文献は、SQL の書式設定を自分で行うことに対して警告しており、ドライバーに任せることを推奨しています。例えば:

cur.execute('select name, age from people where name = %s;', ('ann',) )

次に、ドライバーは SQL 文字列をフォーマットします。何も実行したくないが、完全にフォーマットされた SQL 文字列が欲しいだけだとしましょう。psycopg モジュールでこのフォーマットされた SQL を取得する機能はありますか?

4

2 に答える 2

22

関数 curs.mogrify() を使用します。

SQLstring = curs.mogrify('select name, age from people where name = %s;', ('ann',) )
于 2011-07-21T12:27:32.507 に答える
1

編集: 以下は完全に正しくないようです。psycopg は PQexecParams を使用していませんが、使用する予定です (以下の私のコメントを参照)。それは有用な抽象化であり、ほとんどのパラメーター化されたクエリに当てはまるため、回答を残しますが、まだpsycopg2ではないようです。


実際には、ドライバーは文字列をフォーマットしません。そこで使用しているのは、パラメーター化されたクエリと呼ばれます。SQL文字列とパラメーターは、指定したとおりに「ネットワークを介して」postgresに送信され、postgresはテンプレート文字列を解析してから、パラメーターを解析ツリーに挿入します。そうすれば、パラメーターをエンコードまたはデコードする必要がないため、エンコード エラー、グリッチ、またはインジェクション攻撃の可能性はありません。OTOH、つまり、コードのどこにも、探しているフォーマット ルーチンのようなものがないということです。

詳細については、libpqドキュメントの「PQexecParams」メソッドを参照してください。libpq は、Postgres の C レベル クライアント インターフェイス ライブラリです。

于 2011-07-21T11:51:29.450 に答える