【问题标题】:Why do Sqlalchemy Session.close not log "rollback"?为什么 Sqlalchemy Session.close 不记录“回滚”?
【发布时间】:2013-06-05 04:44:17
【问题描述】:
# I've set echo=True when doing create_engine, so I can see all the sql stmt
# DBSession is ScopeSession(thread_local) and autocommit is False
session = DBSession() 
session.add(somemodel)
# 
try:
    session.flush()
    raise Exception()
    session.commit()
except SQLAlchemyError as e:
    session.rollback()
finally:
    session.close()

根据 SQLAlchemy 文档:

The close() method issues a expunge_all(), and releases any transactional/connection
resources. When connections are returned to the connection pool, transactional state is
rolled back as well.

我希望在执行“session.close()”时看到日志“回滚”

【问题讨论】:

  • 为什么?除非您明确告诉数据库提交,否则不会提交事务。因此,关闭数据库连接或启动新事务会隐式回滚。
  • 一个事务也隐式开始,但我可以看到日志“开始”
  • 我说的是数据库级别,而不是 SQLAlchemy 级别。 SQLAlchemy 在那里显式地启动事务,结束任何以前的事务。

标签: python session sqlalchemy


【解决方案1】:

在池中发生的回滚(或如果已配置,则提交)当前未参与引擎通常为提交/回滚事件执行的日志记录。

票:http://www.sqlalchemy.org/trac/ticket/2752 已添加。

编辑:看了一下这个,我认为这个日志记录应该仍然是池记录器的一部分,而不是引擎的,否则你会得到很多这样的:

sqlalchemy.Engine: COMMIT
sqlalchemy.Engine: ROLLBACK (via pool)

应用程序真的不必太担心池的回滚,因为如果你使用Session,你真的应该在任何close()之前调用commit()rollback()操作。

池日志由create_engine("url", echo_pool='debug') 正常开启,或者在sqlalchemy.pool 命名空间上设置日志。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-10
    • 1970-01-01
    • 1970-01-01
    • 2022-09-30
    • 1970-01-01
    • 2011-04-24
    • 1970-01-01
    • 2017-11-25
    相关资源
    最近更新 更多