我正在寻找一种在执行查询时调试查询的方法,我想知道是否有一种方法可以让 MySQLdb 在完成插入参数和所有这些之后打印出它运行的实际查询?从文档来看,似乎应该有一个 Cursor.info() 调用,它将提供有关上次查询运行的信息,但这在我的版本(1.2.2)中不存在。
这似乎是一个显而易见的问题,但对于我所有的搜索,我都无法找到答案。提前致谢。
我正在寻找一种在执行查询时调试查询的方法,我想知道是否有一种方法可以让 MySQLdb 在完成插入参数和所有这些之后打印出它运行的实际查询?从文档来看,似乎应该有一个 Cursor.info() 调用,它将提供有关上次查询运行的信息,但这在我的版本(1.2.2)中不存在。
这似乎是一个显而易见的问题,但对于我所有的搜索,我都无法找到答案。提前致谢。
我们在游标对象上找到了一个名为的属性,该属性 cursor._last_executed
保存最后一个要运行的查询字符串,即使发生异常也是如此。这对我们来说在生产中比一直使用分析或 MySQL 查询日志更容易和更好,因为这两者都会影响性能并且涉及更多代码或更多相关的单独日志文件等。
讨厌回答我自己的问题,但这对我们来说效果更好。
您可以使用 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))
对我/现在_last_executed
不再起作用了。在您要访问的当前版本中
cursor.statement
.
见:https ://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-statement.html
对于 mysql.connector:
cursor.statement
https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-statement.html
一种方法是打开分析:
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 以找出服务器收到的内容。
cursor.statement
并cursor._last_executed
引发AttributeError
异常
cursor._executed
为我工作!
一般来说,我很幸运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
此只读属性以字符串形式返回最后执行的语句。statement 属性可用于调试和显示发送到 MySQL 服务器的内容。如果执行了多语句字符串,则该字符串可以包含多个语句。这发生在 multi=True 的 execute() 上。在这种情况下,statement 属性包含整个语句字符串,并且 execute() 调用返回一个迭代器,该迭代器可用于处理各个语句的结果。此迭代器的语句属性显示各个语句的语句字符串。
str = cursor.statement
来源:https ://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-statement.html
假设你的 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))