【问题标题】:How to retrieve executed SQL code from SQLAlchemy如何从 SQLAlchemy 中检索已执行的 SQL 代码
【发布时间】:2011-09-15 01:51:44
【问题描述】:

我正在使用 SQLAlchemy 并希望记录 已执行 SQL 代码(即所有绑定参数已被引用和替换的代码)。在 psycopg2 的情况下,可以使用Cursor 对象的query 属性(参见psycopg documentation)。在 MySQLdb 的情况下,可以使用 Cursor 对象的 _last_executed 属性。

我的问题是:如何使用 SQLAlchemy 接口检索刚刚执行的查询字符串?它提供这样的功能还是我应该编写自己的辅助函数?

提前感谢您的帮助。

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

    SQLAlchemy uses the standard Python logging library。将查询记录到名为 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
    

    【讨论】:

    • True,但是 (a) 这也可能会向标准输出发送消息,(b) 您可以通过将特定引擎的 echo 属性设置为 True 来设置类似的效果,以及 (c) SQLA 的日志记录不显示替换占位符的查询,尽管它确实分别记录了参数化的 SQL 和参数。
    • @Vinay 这些都是好点,我已经更新了我的答案以说明如何使用 python 日志记录专门记录到文件,并显示日志记录输出的示例
    • 文档中的重要说明:“它仅在从连接池中获取新连接时检查此级别。因此,在更改已运行应用程序的日志记录配置时,任何连接当前处于活动状态,或者更常见的是在事务中处于活动状态的 Session 对象,在获取新的 Connection 之前不会根据新配置记录任何 SQL(在 Session 的情况下,这是在当前事务结束和新的事务之后开始)。”
    猜你喜欢
    • 2012-03-12
    • 2020-10-15
    • 2011-03-31
    • 2011-01-17
    • 2019-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多