检查“是否已修改”以获取瞬态模型实例

时间:2018-08-10 11:52:34

标签: python sqlalchemy

是否有一种方法可以添加一些历史记录或事件(例如处于瞬态状态),因此当任何属性更改时,我们都可以检测到它并将对象标记为已修改?

这样做的原因是我们在应用程序和数据库之间使用了Redis。当我们创建/修改模型实例时,我们首先在Redis中使用咸菜序列化该对象。

此外,我们使用芹菜定期任务从redis收集此对象并将其填充到数据库中(这有助于我们最小化UPDATE操作)。

但是问题是,当我们从redis反序列化模型实例时,状态为“瞬态”,因此sqlalchemy会话将实例视为新对象,并且不知道是否更改了该对象(通过inspect等)。

我们通过添加其他列“修订”来解决此问题,并在更新属性时手动执行+ = 1。

我们在任务中的代码如下所示:

cached_instance = ... get deserialize models instances list

for inst in cached_instance:
  model = Model._decl_class_registry[inst.__tablename__]
  db_instance = session.query(model).filter(model.id==inst.id).one_or_none()
  if not db_instance:
    # new instance
    session.add(inst)
  else:
    if db_instance.revision < inst.revision:
        session.merge(inst)
session.commit()

但是该代码迫使我们使用附加的SELECT操作,这似乎无效。

验证器,hybrid_property,AttributeEvents似乎也不是一个好的解决方案,因为我们有很多带有很多参数的模型...

有什么主意吗?

0 个答案:

没有答案