sqlalchemy会话未识别mysql数据库中的更改(其他进程操作)

1 投票
1 回答
632 浏览
提问于 2025-04-16 03:11

这个应用程序由以下部分组成:

  • 主进程(使用python和sqlalchemy),它会定期检查数据库(大部分时间都在休眠)
  • 子进程,负责向数据库写入数据
  • 一个网页应用,也会向数据库写入数据

现在的问题是,主进程的会话似乎无法识别在它之外对数据库所做的更改。怎么才能确保它能识别这些更改呢?(目前我每次主进程醒来并进行检查时,都会关闭并重新打开会话)。

1 个回答

1

我每次进程唤醒并进行检查时,都会关闭并重新打开会话。

这样使用SQLAlchemy是行不通的。因为在会话中会跟踪所有的变化。

someobj = Session.query(SomeClass).first()

someobj放进Session的内部缓存里。当你执行someobj.attr = val时,它会在与someobj关联的会话中标记这个变化。

所以,如果你从某个会话session1中取出了object1,然后关闭了session1,那么object1就不再和任何会话关联,也就不再被跟踪了。

最好的解决办法是在变化发生时立即提交:

object1 = newsession.add(object1)
newsession.commit()

否则你就得自己管理对象的缓存,并在每次检查时合并所有对象。

撰写回答