如何从SQLAlchemy获取执行的SQL代码

10 投票
1 回答
8677 浏览
提问于 2025-04-16 19:34

我正在使用SQLAlchemy,想要记录已经执行的SQL代码,也就是那些所有参数都已经替换成具体值的代码。对于psycopg2,可以通过Cursor对象的query属性来实现(具体可以查看psycopg的文档)。而对于MySQLdb,则可以通过Cursor对象的_last_executed属性来获取。

我的问题是:如何通过SQLAlchemy的接口获取刚刚执行的查询字符串?它是否提供这样的功能,还是我需要自己写一个辅助函数?

提前感谢任何帮助。

1 个回答

25

SQLAlchemy使用的是标准的Python日志库。如果你想把查询记录到一个叫做 db.log 的文件里,可以这样做:

import logging

logging.basicConfig(filename='db.log')
logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO)

在使用Python的日志功能时,要确保所有的 echo 标志都设置为 False,这样可以避免重复记录日志。接下来,往数据库里添加一些东西:

>>> Movie(title=u"Blade Runner", year=1982)
>>> session.commit()

这将会记录类似这样的内容:

INFO:sqlalchemy.engine.base.Engine:BEGIN (implicit)
INFO:sqlalchemy.engine.base.Engine:INSERT INTO models_movie (title, year, description) VALUES (%(title)s, %(year)s, %(description)s) RETURNING models_movie.id
INFO:sqlalchemy.engine.base.Engine:{'title': u'Blade Runner', 'description': None, 'year': 1982}
INFO:sqlalchemy.engine.base.Engine:COMMIT

撰写回答