所以,我已经阅读了很多关于sqlalchemy如何运作的相互矛盾的报道。我已经读过它不会缓存查询等等。这些似乎都不符合我的经验。
我举一个例子:
>>> x = Session.query(statusStorage).all()
>>> for i in x:
... print i.id
...
1
... - records omitted
100000
>>> Session.expire_all()
>>> x = Session.query(statusStorage).all()
>>> for i in x:
... print i.id
...
1
... - records omitted
100000
>>> Session.commit()
>>> x = Session.query(statusStorage).all()
>>> for i in x:
... print i.id
...
1
... - records omitted
100001
所以这个线程正在查询MySQL数据库,获取类的所有项,然后打印一个字段。运行第一个查询后,我在另一个python进程中运行相同的查询,并通过添加1来更改最后一项的ID。
当我运行下一个请求时,在expire_all之后,它返回相同的结果,并且id仍然保持不变。我已经在我开发的代码中发生了这种情况,搜索过滤了。
回滚和提交都将解决问题,expire(object)和expire_all()都无法使sqlalchemy缓存失效。
我是否理解sqlalchemy隐含的内容?我不能在没有回滚或提交的情况下清除缓存的内容吗?我在python 2.7上运行1.0.9。
答案 0 :(得分:3)
我在IRC上回答了这个问题,但问题只是InnoDB的默认事务隔离级别是“REPEATABLE READ”,这意味着第二次和第三次查询不允许(由数据库)查看您的更改。