打印MySQLdb运行的实际查询?

xit*_*ium 68 python mysql mysql-python

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

这似乎是一个显而易见的问题,但对于我所有的搜索,我都找不到答案.提前致谢.

xit*_*ium 117

我们在被调用的游标对象上找到了一个属性,  cursor._last_executed它保存了即使发生异常时要运行的最后一个查询字符串.对于我们来说,这比使用概要文件或MySQL查询日志记录更容易和更好,因为这些都会影响性能并涉及更多代码或更多关联单独的日志文件等.

讨厌回答我自己的问题,但这对我们来说效果更好.


Mar*_*oma 29

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

try:
    cursor.execute(sql, (arg1, arg2))
    connection.commit()
except:
    print(cursor._last_executed)
    raise
Run Code Online (Sandbox Code Playgroud)

目前,有一个讨论如何将它作为pymysql中的一个真正的特性(参见pymysql问题#330:将mogrify添加到Cursor,它返回要执行的确切字符串 ; pymysql应该用来代替MySQLdb)

编辑:我现在没有测试它,但是这个提交表明以下代码可能有效:

cursor.mogrify(sql, (arg1, arg2))
Run Code Online (Sandbox Code Playgroud)


mar*_*_st 15

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

cursor.statement.

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

  • 是 - 'CMySQLCursor' 对象没有属性 '_last_executed' (3认同)
  • 如果您的查询引发异常,这将失败 (3认同)

Uma*_*air 12

cursor.statementcursor._last_executed提出AttributeError异常

cursor._executed
Run Code Online (Sandbox Code Playgroud)

为我工作!


unu*_*tbu 5

一种方法是打开分析

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

产量

(1L, 0.000154, 'SELECT * FROM blah where foo = 11')
Run Code Online (Sandbox Code Playgroud)

请注意,参数已插入查询中,即使查询失败也记录了查询。

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

sudo invoke-rc.d mysql stop
sudo mysqld --log=/tmp/myquery.log
Run Code Online (Sandbox Code Playgroud)

然后,您必须浏览/tmp/myquery.log来找出服务器收到的内容。