是否有一种方法可以添加一些历史记录或事件(例如处于瞬态状态),因此当任何属性更改时,我们都可以检测到它并将对象标记为已修改?
这样做的原因是我们在应用程序和数据库之间使用了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似乎也不是一个好的解决方案,因为我们有很多带有很多参数的模型...
有什么主意吗?