Python SQLAlchemy 关系设置事件钩子
在SQLAlchemy的ORM中,可以通过以下代码来为所有表和列设置属性变化的事件:
@event.listens_for(Base, 'attribute_instrument')
def configure_listener(class_, key, inst):
if not hasattr(inst.property, 'columns'):
return
@event.listens_for(inst, "set", retval=True)
def set_column_value(instance, value, oldvalue, initiator):
column = inst.property.columns[0]
# HOOK CODE
logging.info("%s: %s -> %s" % (inst.property.columns[0], oldvalue, value))
return value
不过,这种方法不适用于关系属性。也就是说,表中的关系属性不会经过这个事件,而官方指南也没有提到关系属性不会被事件处理。那么问题来了:在SQLAlchemy中,有没有办法来处理与关系属性修改相关的事件呢?
备注:我原本以为,因为关系是通过外键列连接到其他表的,所以修改这个(外键)列会触发一个事件,但我错了:这种情况只有在记录已经有有效的ID时才会发生事件;如果对象还没有被添加到数据库中,这个事件就不会被触发。
1 个回答
0
我觉得在1.0版本的SQLAlchemy中,现在有一个叫做init_collection
的事件。
http://docs.sqlalchemy.org/en/latest/orm/events.html#attribute-events