如何记录 sqlalchemy 中返回的 SQL 语句和行以帮助调试?

Rob*_*ark 10 debugging logging sqlalchemy

我如何配置sqlalchemy以记录它正在向数据库服务器发出的 SQL 语句,并记录从这些语句返回的行?这对调试很有用。

Rob*_*ark 12

选项 1:将sqlalchemy.engine记录器日志级别设置为logging.INFOlogging.DEBUG 例如,

>>> import logging
>>> logging.basicConfig()
>>> logger = logging.getLogger('sqlalchemy.engine')
>>> logger.setLevel(logging.DEBUG)
>>> session.query(User).all()
2015-01-02 11:54:25,854 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2015-01-02 11:54:25,856 INFO sqlalchemy.engine.base.Engine SELECT users.id AS users_id, users.name AS users_name
FROM users
2015-01-02 11:54:25,857 INFO sqlalchemy.engine.base.Engine {}
2015-01-02 11:54:25,858 DEBUG sqlalchemy.engine.base.Engine Col ('users_id', 'users_name')
2015-01-02 11:54:25,860 DEBUG sqlalchemy.engine.base.Engine Row (1, u'Alice')
2015-01-02 11:54:25,860 DEBUG sqlalchemy.engine.base.Engine Row (2, u'Bob')
Run Code Online (Sandbox Code Playgroud)

参考:配置日志记录

选项 2:echo调用时使用arg sqlalchemy.create_engine()

例如,

>>> from sqlalchemy import create_engine
>>> from sqlalchemy.orm import sessionmaker
>>> engine = create_engine('postgres://postgres_user:my_password@localhost/my_db',
...                        echo="debug")
>>> Session = sessionmaker(bind=engine)
>>> session = Session()
>>> users = session.query(User).all()
2015-01-02 11:54:25,854 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2015-01-02 11:54:25,856 INFO sqlalchemy.engine.base.Engine SELECT users.id AS users_id, users.name AS users_name
FROM users
2015-01-02 11:54:25,857 INFO sqlalchemy.engine.base.Engine {}
2015-01-02 11:54:25,858 DEBUG sqlalchemy.engine.base.Engine Col ('users_id', 'users_name')
2015-01-02 11:54:25,860 DEBUG sqlalchemy.engine.base.Engine Row (1, u'Alice')
2015-01-02 11:54:25,860 DEBUG sqlalchemy.engine.base.Engine Row (2, u'Bob')
Run Code Online (Sandbox Code Playgroud)

根据 sqlalchemy 文档:

*sqlalchemy。create_engine (*args, **kwargs)
...
echo=False – 如果为 True,引擎会将所有语句及其参数列表的 repr() 记录到引擎记录器中,默认为 sys.stdout。Engine的echo属性可以随时修改,开启和关闭日志。如果设置为字符串“debug”,结果行也将打印到标准输出。

  • 似乎人们在文档中很难找到它,但您也可以[直接使用 Python 日志记录 API](http://docs.sqlalchemy.org/en/rel_0_9/core/engines.html#configuring-logging) 来完全自定义日志记录如何运行。 (2认同)