Python SQLAlchemy 关系设置事件钩子

5 投票
1 回答
979 浏览
提问于 2025-04-18 05:34

在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

撰写回答