Mar*_*agh 6 python pyodbc python-db-api
使用pyodbc等数据库库时实现Python数据库API规范如何在应用参数替换后获得完全准备好的查询.我正在调用一个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()
Run Code Online (Sandbox Code Playgroud)
预期的最终查询(待记录)
CREATE TABLE stocks (symbol varchar(10), price real)
INSERT INTO stocks VALUES ('RHAT', 35.14)
SELECT * FROM stocks WHERE symbol = 'RHAT'
Run Code Online (Sandbox Code Playgroud)
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()
Run Code Online (Sandbox Code Playgroud)
我已经把sqlite3放在了示例中,因为它不需要pyodbc来试用它.
UPDATE
似乎当使用预准备语句时,将数据填充到模板中的过程在DBMS中的服务器端完成.因此,经常没有方法或api从服务器获取查询的最终版本,如user581592的答案中所述.其他值得注意的链接是关于pyodbc的问题163,它进一步讨论了这个问题.还有一些像psycopg这样的db库添加了一个方法mogrify,它将返回最终语句.但正如他们的文档中所提到的,这不是DB API的一部分.
小智 5
来自https://groups.google.com/forum/#!topic/pyodbc/656mRdbjFuc
pyodbc不会以任何方式修改SQL。通常,“好的” ODBC驱动程序也不是。
由于它不是受支持的函数,因此没有用于检索最终SQL的ODBC函数,因此pyodbc不可能提供此功能。
因此,最好的选择是将查询和参数分别记录在脚本中,或者如果可行的话,可以尝试在数据库上配置某种级别的查询记录。