打印MySQLdb运行的实际查询?

时间:2011-08-15 21:43:38

标签: python mysql mysql-python

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

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

9 个答案:

答案 0 :(得分:113)

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

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

答案 1 :(得分:26)

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

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

目前,讨论如何将此作为pymysql中的真实功能(请参阅pymysql issue #330: Add mogrify to Cursor, which returns the exact string to be executed;应使用pymysql代替MySQLdb

编辑:我现在没有对其进行测试,但this commit表示以下代码可能有效:

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

答案 2 :(得分:12)

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

cursor.statement

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

答案 3 :(得分:4)

执行此操作的一种方法是启用profiling

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以找出服务器收到的内容。

答案 4 :(得分:3)

答案 5 :(得分:1)

一般来说,我很幸运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    

答案 6 :(得分:1)

cursor.statementcursor._last_executed 引发了 AttributeError 异常

cursor._executed

为我工作!

答案 7 :(得分:-1)

我不能说我见过

Cursor.info()

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

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

答案 8 :(得分:-1)

假设您的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))