Python SQLAlchemy';s expire\u所有缓存数据是否都实际过期?

Python SQLAlchemy';s expire\u所有缓存数据是否都实际过期?,python,sqlalchemy,Python,Sqlalchemy,所以,我读了很多关于sqlalchemy如何工作的相互矛盾的报告。我读过,它不缓存查询等。所有这些似乎都不符合我的经验 我举个例子: >>> x = Session.query(statusStorage).all() >>> for i in x: ... print i.id ... 1 ... - records omitted 100000 >>> Session.expire_all() >>>

所以,我读了很多关于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缓存过期


我是否未能理解炼金术中隐含的某些东西?我不应该在没有回滚或提交的情况下清除缓存的内容吗?我在Python2.7上运行1.0.9。

我在IRC上回答了这个问题,但问题很简单,InnoDB的默认事务隔离级别是“可重复读取”,这意味着(数据库)不允许第二个和第三个查询查看您的更改。

我在IRC上回答了这个问题,但问题很简单,InnoDB的默认事务隔离级别是“可重复读取”,这意味着(数据库)不允许第二个和第三个查询查看您的更改。

对不起,没有评论的否决票非常低。这是两个默认值以意外方式交互的一个非常恼人的例子。MySQL和sqlalchemy是一种相当常见的组合,但我看到很多人询问这种组合可能导致的问题,被告知使用会话线程和正确使用expire等,而不是建议这样做。很抱歉,没有评论的否决票非常少。这是两个默认值以意外方式交互的一个非常恼人的例子。MySQL和sqlalchemy是一种相当常见的组合,但我看到很多人询问这种组合可能导致的问题,被告知使用会话线程和正确使用expire等,而不是建议这样做。