【问题标题】:How to log SQL statements and rows returned in sqlalchemy to aid in debugging?如何记录 sqlalchemy 中返回的 SQL 语句和行以帮助调试?
【发布时间】:2015-03-01 03:11:18
【问题描述】:

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

【问题讨论】:

    标签: debugging logging sqlalchemy


    【解决方案1】:

    选项 1:将 sqlalchemy.engine logger 日志级别设置为 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')
    

    参考:Configuring Logging

    选项 2:在调用 sqlalchemy.create_engine() 时使用 echo 参数:

    例如,

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

    Per the sqlalchemy documentation:

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

    【讨论】:

    • 似乎人们很难在文档中找到此内容,但您也可以use the Python logging API directly 来完全自定义日志记录的运行方式。
    • 谢谢@zzzeek!我现在已将其添加到答案中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多