79

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

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

4

10 回答 10

124

我们在游标对象上找到了一个名为的属性,该属性 cursor._last_executed保存最后一个要运行的查询字符串,即使发生异常也是如此。这对我们来说在生产中比一直使用分析或 MySQL 查询日志更容易和更好,因为这两者都会影响性能并且涉及更多代码或更多相关的单独日志文件等。

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

于 2011-08-25T13:08:44.187 回答
41

您可以使用 cursor 属性打印最后执行的查询_last_executed

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

目前,有一个讨论如何在 pymysql 中将其作为一个真正的特性(参见pymysql 问题 #330:将 mogrify 添加到光标,它返回要执行的确切字符串pymysql应该使用而不是MySQLdb

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

cursor.mogrify(sql, (arg1, arg2))
于 2014-05-14T08:55:08.717 回答
36

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

cursor.statement.

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

于 2014-05-22T10:29:47.943 回答
12

对于 mysql.connector:

cursor.statement

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

于 2017-04-17T21:50:30.050 回答
7

一种方法是打开分析

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')

请注意,参数被插入到查询中,并且即使查询失败,查询也会被记录。

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

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

然后您必须筛选 /tmp/myquery.log 以找出服务器收到的内容。

于 2011-08-15T22:18:19.623 回答
6

cursor.statementcursor._last_executed引发AttributeError异常

cursor._executed

为我工作!

于 2021-01-05T13:33:08.230 回答
2

一般来说,我很幸运cursor._last_executed,但与cursor.executemany(). 除了最后一个陈述之外,这一切都消失了。这基本上是我现在在该实例中使用的(基于实际 MySQLDb 游标源的调整):

def toSqlResolvedList( cursor, sql, dynamicValues ):
    sqlList=[]
    try:
        db = cursor._get_db()
        if isinstance( sql, unicode ): 
            sql = sql.encode( db.character_set_name() )
        for values in dynamicValues :
            sqlList.append( sql % db.literal( values ) )
    except: pass
    return sqlList    
于 2018-01-02T20:02:22.507 回答
0

此只读属性以字符串形式返回最后执行的语句。statement 属性可用于调试和显示发送到 MySQL 服务器的内容。如果执行了多语句字符串,则该字符串可以包含多个语句。这发生在 multi=True 的 execute() 上。在这种情况下,statement 属性包含整个语句字符串,并且 execute() 调用返回一个迭代器,该迭代器可用于处理各个语句的结果。此迭代器的语句属性显示各个语句的语句字符串。

str = cursor.statement

来源:https ://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-statement.html

于 2021-09-18T19:26:44.667 回答
-1

我不能说我见过

Cursor.info()

在文档中,经过几分钟的搜索,我找不到它。也许您看到了一些旧文档?

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

于 2011-08-15T22:12:08.950 回答
-2

假设你的 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))
于 2016-11-09T01:35:30.763 回答