toh*_*ter 5 python orm sqlalchemy
背景
该get()方法在 SQLAlchemy 的 ORM 中很特殊,因为它在向数据库发出 SQL 查询之前尝试从恒等映射中返回对象(请参阅文档)。
这对于性能来说很有好处,但可能会给分布式应用程序带来问题,因为对象可能已被另一个进程修改,因此本地进程无法知道该对象是脏的,并且在以下情况下将继续从身份映射中检索过时的对象:get()叫做。
问题
如何强制get()忽略身份映射并每次都向数据库发出调用?
例子
Company在 ORM 中定义了一个对象。price_updater()更新stock_price所有对象属性的过程。Companybuy_and_sell_stock()偶尔买卖股票的流程。
microsoft = Company.query.get(123)对象。 Company.query.get(123). 从那时起,股价发生了变化,但我的buy_and_sell_stock()进程不知道这种变化,因为它发生在另一个进程中。 get(123)返回过时的版本,这是一个问题。Company我已经对 SO(在 [sqlalchemy] 标签下)进行了搜索,并阅读了 SQLAlchemy 文档以尝试找出如何做到这一点,但还没有找到方法。
使用session.expire(my_instance)将导致数据在访问时被重新选择。但是,即使您使用expire(或expunge),下一个获取的数据也将基于事务隔离级别。请参阅有关隔离级别的 PostgreSQL 文档(它也适用于其他数据库)和有关设置隔离级别的 SQLAlchemy 文档。
in您可以使用:测试实例是否在会话中my_instance in session。
您可以使用filter而不是get绕过缓存,但它仍然具有相同的隔离级别限制。
Company.query.filter_by(id=123).one()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1808 次 |
| 最近记录: |