如何在Python cursor.execute中查看真正的SQL查询

phi*_*ext 45 python sql ms-access pyodbc

我在Python中使用以下代码(pyodbc用于MS-Access基础).

cursor.execute("select a from tbl where b=? and c=?", (x, y))
Run Code Online (Sandbox Code Playgroud)

没关系,但是出于维护目的,我需要知道发送到数据库的完整而准确的SQL字符串.
有可能吗?怎么样?

sam*_*ias 44

它因司机而异.这是两个例子:

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"
Run Code Online (Sandbox Code Playgroud)

  • 在psycopg2中还有游标的`mogrify()`方法,它可以让你在没有(或之前)执行它的情况下确切地看到给定查询将执行什么命令. (8认同)
  • 在MySQLdb**'_ last_executed'**中保存最后一个查询字符串,即使发生异常也是如此.如果错误,属性**_执行**为None.[http://stackoverflow.com/a/7190914/653372] (5认同)
  • op 专门说 pyodbc for MS Access。不是 MySQL 或 Postgres (4认同)

jos*_*eph 10

您可以使用它print cursor._last_executed来获取上次执行的查询.

阅读答案,您还可以使用它print cursor.mogrify(query,list)来执行之前或之后查看完整查询.


phi*_*ext 6

答案是不.我在项目'home Google Code(以及Google Group)中发布我的问题的答案是:

在问题163上的评论#1由l ... @ deller.id.au:cursor.mogrify返回查询字符串 http://code.google.com/p/pyodbc/issues/detail?id=163

这里有一个链接到他们所指的"mogrify"游标方法的pyscopg文档:http: //initd.org/psycopg/docs/cursor.html#cursor.mogrify

pyodbc不执行SQL的任何此类转换:它将参数化SQL直接传递给ODBC驱动程序.唯一涉及的处理是将参数从Python对象转换为ODBC API支持的C类型.

在将ODBC发送到服务器之前,可以在ODBC驱动程序中执行某些转换(例如Microsoft SQL Native Client执行此操作),但这些转换在pyodbc中是隐藏的.

因此,我认为在pyodbc中提供mogrify函数是不可行的.


pie*_*oni 5

为了调试目的,我创建了一个检查函数,它只是替换 ? 与查询值...这不是高科技:)但它有效!:D

def check_sql_string(sql, values):
    unique = "%PARAMETER%"
    sql = sql.replace("?", unique)
    for v in values: sql = sql.replace(unique, repr(v), 1)
    return sql

query="""SELECT * FROM dbo.MA_ItemsMonthlyBalances
                   WHERE Item = ? AND Storage = ? AND FiscalYear = ? AND BalanceYear = ? AND Balance = ? AND BalanceMonth = ?"""
values = (1,2,"asdasd",12331, "aas)",1)

print(check_sql_string(query,values))
Run Code Online (Sandbox Code Playgroud)

结果:

SELECT * FROM dbo.MA_ItemsMonthlyBalances WHERE Item = 1 AND St​​orage = 2 AND FiscalYear = 'asdasd' AND BalanceYear = 12331 AND Balance = 'aas') AND BalanceMonth = 1

有了这个,你可以记录或做任何你想做的事:

rowcount = self.cur.execute(query,values).rowcount
logger.info(check_sql_string(query,values))
Run Code Online (Sandbox Code Playgroud)

如果您需要,只需向函数添加一些异常捕获即可。