如何在使用pyodbc和MS-Access的Python cursor.execute中查看真实SQL查询

84 投票
11 回答
146750 浏览
提问于 2025-04-16 13:28

我在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功能是不可行的。

撰写回答