当使用实现Python 数据库 API 规范的pyodbc等数据库库时,如何在应用参数替换后获得完全准备好的查询。我正在调用一个 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 来试用。
更新
似乎当使用准备好的语句时,将数据填充到模板中的过程是在 DBMS 中的服务器端完成的。如user581592's answer中所述,经常没有方法或api可以从服务器获取查询的最终版本。其他值得注意的链接是pyodbc 上的第 163 期,进一步讨论了这一点。此外,像 psycopg 这样的一些数据库库添加了一个mogrify方法,该方法将返回最终语句。但正如他们的文档中提到的,这不是 DB API 的一部分。