当使用像这样的数据库库时pyodbc http://code.google.com/p/pyodbc/实施Python 数据库 API 规范 http://www.python.org/dev/peps/pep-0249/应用参数替换后如何获得完全准备好的查询。我正在调用 Sybase 存储过程,该存储过程将通过参数替换接收 18 个参数。我想捕获实际进行的调用并记录它以帮助调试。我需要的一个更简单的例子:
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()
我已经放置了 sqlite3 示例,因为它不需要 pyodbc 来尝试。
UPDATE
似乎当一个人使用准备好的陈述 http://en.wikipedia.org/wiki/Prepared_statements将数据填充到模板中的过程是在 DBMS 的服务器端完成的。因此,通常没有方法或 API 可以从服务器获取查询的最终版本,如 user581592 的答案中所述。其他值得注意的链接是第163期 http://code.google.com/p/pyodbc/issues/detail?id=163在 pyodbc 上进一步讨论了这一点。另外一些数据库库(例如 psycopg)添加了一个方法mogrify http://initd.org/psycopg/docs/cursor.html#cursor.mogrify这将返回最终的语句。但正如他们的文档中提到的,这不是 DB API 的一部分。