如何在使用pyodbc和MS-Access的Python cursor.execute中查看真实SQL查询
我在Python中使用以下代码(用pyodbc连接一个MS-Access数据库)。
cursor.execute("select a from tbl where b=? and c=?", (x, y))
这样做没问题,但为了方便维护,我需要知道发送到数据库的完整和准确的SQL字符串。
这可能吗?怎么做呢?
11 个回答
16
你可以用 print cursor._last_executed
来查看最后执行的查询语句。
在 这个 回答中提到,你也可以用 print cursor.mogrify(query,list)
来查看完整的查询语句,无论是在执行之前还是之后。
81
这要看具体的驱动程序。下面是两个例子:
import MySQLdb
mc = MySQLdb.connect()
r = mc.cursor()
r.execute('select %s, %s', ("foo", 2))
r._executed
"select 'foo', 2"
import psycopg2
pc = psycopg2.connect()
r = pc.cursor()
r.execute('select %s, %s', ('foo', 2))
r.query
"select E'foo', 2"
13
答案是:不可以。我在这个项目的Google Code主页(还有Google小组)上发布了我的问题,得到的回答是:
在问题163的评论#1中,l...@deller.id.au提到:cursor.mogrify返回查询字符串 http://code.google.com/p/pyodbc/issues/detail?id=163
这里有一个链接,指向pyscopg文档中关于他们的“mogrify”游标方法的内容,报告者提到的就是这个: http://initd.org/psycopg/docs/cursor.html#cursor.mogrify
pyodbc并不会对SQL进行任何这样的转换:它会把参数化的SQL直接传递给ODBC驱动,完全不做修改。唯一的处理就是把Python对象的参数转换成ODBC API支持的C类型。
在SQL被发送到服务器之前,ODBC驱动可能会对其进行一些转换(例如,微软的SQL Native Client会这样做),但这些转换对pyodbc来说是隐藏的。
因此,我认为在pyodbc中提供一个mogrify功能是不可行的。