打印MySQLdb运行的实际查询?

我正在寻找一种方式来debugging查询,因为他们正在执行,我想知道是否有办法让MySQLdb打印出它运行的实际查询,完成插入参数后,所有这一切? 从文档中,似乎应该有一个Cursor.info()调用,它将提供有关上次查询的信息,但是在我的版本(1.2.2)中并不存在。

这似乎是一个明显的问题,但是对于我所有的search,我一直没有find答案。 提前致谢。

我们在游标对象上find了一个名为cursor._last_executed的属性,它保存了即使发生exception也要运行的最后一个查询string。 对于我们来说,生产过程比使用总线分析或MySQL查询logging更容易,更好,因为这两者都会对性能产生影响,涉及更多的代码或更多的关联单独的日志文件等。

讨厌回答我自己的问题,但是这对我们来说更好。

您可以使用游标属性_last_executed打印上次执行的查询:

 try: cursor.execute(sql, (arg1, arg2)) connection.commit() except: print(cursor._last_executed) raise 

目前,有一个讨论如何把它作为pymysql中的一个真正的特征(请参阅pymysql问题#330:向Cursor添加mogrify,它将返回要执行的确切string ;应该使用pymysql来代替MySQLdb

编辑:我现在没有testing它,但是这个提交表明下面的代码可能工作:

 cursor.mogrify(sql, (arg1, arg2)) 

对于我/现在_last_executed不工作了。 在您想要访问的当前版本中

cursor.statement

请参阅: https : //dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-statement.html

一种方法是打开configuration文件 :

 cursor.execute('set profiling = 1') try: cursor.execute('SELECT * FROM blah where foo = %s',[11]) except Exception: cursor.execute('show profiles') for row in cursor: print(row) cursor.execute('set profiling = 0') 

产量

 (1L, 0.000154, 'SELECT * FROM blah where foo = 11') 

注意参数被插入到查询中,即使查询失败,查询也被logging下来。

另一种方法是在打开日志logging的情况下启动服务器:

 sudo invoke-rc.d mysql stop sudo mysqld --log=/tmp/myquery.log 

然后,您必须通过/tmp/myquery.log来查找服务器收到的内容。

我不能说我见过

 Cursor.info() 

在文档中,几分钟search后我找不到它。 也许你看到一些旧的文档?

同时,您可以随时打开MySQL查询日志logging ,并查看服务器的日志文件。

假设你的sql就像select * from table1 where 'name' = %s

 from _mysql import escape from MySQLdb.converters import conversions actual_query = sql % tuple((escape(item, conversions) for item in parameters))