Python SQLAlchemy关系集事件挂钩

时间:2014-05-06 15:31:15

标签: python orm 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 

但这种方法不适合人际关系。作为关系的表属性不会通过此事件,而official guide不会告诉该关系的属性不会被事件处理。所以问题是:SQLAlchemy中是否有任何方法可以挂钩事件以及关系属性修改?

备注:我希望因为通过外键列与其他表链接的关系然后修改这个(外键)列会生成一个事件但是我错了:只有在记录已经具有有效的Id但是否则(当对象尚未添加到数据库时)此事件未被引发。

1 个答案:

答案 0 :(得分:0)

我认为1.0 sqlalchemy现在有一个init_collection事件

http://docs.sqlalchemy.org/en/latest/orm/events.html#attribute-events