【问题标题】:sqlAlchemy does not recognise changes to DB made outside of sessionsqlAlchemy 无法识别在会话之外对数据库所做的更改
【发布时间】:2015-09-19 16:56:36
【问题描述】:

我注意到的一些特殊情况是,在 sqlAlchemy 会话中无法识别会话之外(例如在 MySQL 的 Workbench 中进行的更改)提交给数据库的任何更改。我必须关闭并打开一个新会话,以便 sqlAlchemy 识别它。

例如,我手动删除的一行仍然是从 sqlAlchemy 中获取的。

这是我初始化会话的方式:

engine   = create_engine('mysql://{}:{}@{}/{}'.format(username, password, host, schema), pool_recycle=3600)
Session  = sessionmaker(bind=engine)
session  = Session()
metadata = MetaData()

如何让 sqlAlchemy 识别它们?

我的 sqlAlchemy 版本是 0.9.4,我的 MySQL 版本是 5.5.34。我们只使用 sqlAlchemy 的核心(没有 ORM)。

【问题讨论】:

  • 这可能不足以完全理解代码。你打电话给session.add()(或类似的)和session.commit()吗?
  • 我在几个地方做我updateinsert 进入数据库。否则没有。我只想了解为什么 sqlAlchemy 的会话仍会从数据库中获取已删除的行。本质上,我是否需要定期调用commit() 以确保在我查询一行之前甚至每次都获取这些更改?
  • 用“READ_COMMITTED”试试这个docs.sqlalchemy.org/en/rel_0_9/dialects/…
  • @pavel_form 这似乎已经解决了,非常感谢!将其添加为答案,以便我可以投票并接受它,如果你喜欢:)

标签: python mysql sqlalchemy


【解决方案1】:

为了能够从其他事务中读取已提交的数据,您需要将事务隔离级别设置为READ COMMITTED。对于 sqlalchemy 和 mysql:

使用create_engine()设置隔离级别:

engine = create_engine(
    "mysql://scott:tiger@localhost/test",
    isolation_level="READ COMMITTED")

使用每个连接执行选项进行设置:

connection = engine.connect()
connection = connection.execution_options(
    isolation_level="READ COMMITTED")

source

【讨论】:

    猜你喜欢
    • 2021-03-14
    • 1970-01-01
    • 1970-01-01
    • 2019-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    • 2015-02-08
    相关资源
    最近更新 更多