6

Python データベース API 仕様を実装するpyodbcなどのデータベース ライブラリを使用する場合、パラメーター置換が適用された後に完全に準備されたクエリを取得するにはどうすればよいでしょうか。パラメータ置換によって 18 個の引数を受け取る Sybase ストアド プロシージャを呼び出しています。行われた実際の呼び出しをキャプチャしてログに記録し、デバッグに役立てたいと思います。私が必要とするもののより簡単な例:

pyodbc の例

import pyodbc
conn = pyodbc.connect('DSN=test;PWD=password')
c = conn.cursor()
c.execute('CREATE TABLE stocks (symbol varchar(10), price real)')
c.execute("INSERT INTO stocks VALUES (?, ?)", ('RHAT', 35.14))
c.execute('SELECT * FROM stocks WHERE symbol=?', ('RHAT',))
print c.fetchone()

予想される最終クエリ (ログに記録される)

CREATE TABLE stocks (symbol varchar(10), price real)
INSERT INTO stocks VALUES ('RHAT', 35.14)
SELECT * FROM stocks WHERE symbol = 'RHAT'

sqlite3 の例

import sqlite3
conn = sqlite3.connect(':memory:')
c = conn.cursor()
c.execute('CREATE TABLE stocks (symbol text, price real)')
c.execute("INSERT INTO stocks VALUES (?, ?)", ('RHAT', 35.14))
c.execute('SELECT * FROM stocks WHERE symbol=?', ('RHAT',))
print c.fetchone()

試すのにpyodbcは必要ないので、sqlite3の例を載せました。

アップデート

準備済みステートメントを使用する場合、テンプレートにデータを入力するプロセスは、DBMS のサーバー側で行われるようです。そのため、user581592 の回答で説明されているように、サーバーからクエリの最終バージョンを取得するためのメソッドや API がないことがよくあります。注目すべきその他のリンクは、これについてさらに議論している pyodbcのIssue 163です。また、psycopg などの一部の db ライブラリには、最終ステートメントを返すメソッドmogrifyが追加されています。しかし、ドキュメントに記載されているように、これは DB API の一部ではありません。

4

1 に答える 1