sqlalchemy会话未识别mysql数据库中的更改(其他进程操作)
这个应用程序由以下部分组成:
- 主进程(使用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()
否则你就得自己管理对象的缓存,并在每次检查时合并所有对象。