相关疑难解决方法(0)

在身份映射之外强制执行 sqlalchemy ORM get()

背景

get()方法在 SQLAlchemy 的 ORM 中很特殊,因为它在向数据库发出 SQL 查询之前尝试从恒等映射中返回对象(请参阅文档

这对于性能来说很有好处,但可能会给分布式应用程序带来问题,因为对象可能已被另一个进程修改,因此本地进程无法知道该对象是脏的,并且在以下情况下将继续从身份映射中检索过时的对象:get()叫做。


问题

如何强制get()忽略身份映射并每次都向数据库发出调用?


例子

  • Company在 ORM 中定义了一个对象。
  • 我有一个每秒price_updater()更新stock_price所有对象属性的过程。Company
  • 我有一个buy_and_sell_stock()偶尔买卖股票的流程。
    • 现在,在这个过程中,我可能已经加载了一个microsoft = Company.query.get(123)对象。
    • 几分钟后,我可能会再次发出Company.query.get(123). 从那时起,股价发生了变化,但我的buy_and_sell_stock()进程不知道这种变化,因为它发生在另一个进程中。
    • 因此,调用会从会话的身份映射中get(123)返回过时的版本,这是一个问题。Company

我已经对 SO(在 [sqlalchemy] 标签下)进行了搜索,并阅读了 SQLAlchemy 文档以尝试找出如何做到这一点,但还没有找到方法。

python orm sqlalchemy

5
推荐指数
1
解决办法
1808
查看次数

标签 统计

orm ×1

python ×1

sqlalchemy ×1