检测SQLAlchemy模型是否具有与之关联的挂起写操作

时间:2019-01-31 03:12:30

标签: python mysql python-2.7 sqlalchemy pyramid

我有一个应用程序,在该应用程序中,我查询一个SQL数据库,最后得到一个表示给定行的SQL Alchemy对象。然后,根据用户输入和一系列if / then语句,我可以对SQLA对象执行更新。

if 'fooinput1' in payload:
   sqla_instance.foo1 = validate_foo1(fooinput1)
if 'fooinput2' in payload:
   sqla_instance.foo2 = validate_foo2(fooinput2)
...

我现在需要向该系统添加modified_atmodified_by数据。是否可以在SQLA实例上检查诸如sqla_instance.was_modifiedsqla_instance.update_pending之类的内容以确定是否执行了修改?

(我认识到我可以保留自己的was_modified布尔值,但是由于其中许多if / then子句会导致很多样板,如果可能的话,我想避免。)< / p>


FWIW:这是一个python 2.7金字塔应用程序,它是在Web请求的上下文中从MySQL数据库读取的。

3 个答案:

答案 0 :(得分:3)

SQL Alchemy ORM提供的Session对象具有两个属性,可以帮助您进行尝试:

1)Session.is_modified()

2)Session.dirty

答案 1 :(得分:1)

根据要跟踪的修改的字段数,可以使用ORM Events实现所需的功能:

@sa.event.listens_for(Thing.foo, 'set')
def foo_changed(target, value, oldvalue, initiator):
    target.last_modified = datetime.now()

@sa.event.listens_for(Thing.baz, 'set')
def baz_changed(target, value, oldvalue, initiator):
    target.last_modified = datetime.now()

答案 2 :(得分:0)

会话对象提供事件,可能会对您有所帮助。 只需审查一次, ->过渡到会话对象的待处理状态