相关疑难解决方法(0)

在更新/插入时修改其他对象

我有两个映射对象,父对象和子对象。

class Parent(Base):
    __tablename__ = 'parent'
    id = ...
    name = ...
    date_modified = Column(SA_DateTime, default=DateTime.now,
                           onupdate=DateTime.now, nullable=False)

class Child(Base):
    __tablename__ = 'child'
    id = ...
    name = ...
    date_modified = Column(SA_DateTime, default=DateTime.now,
                           onupdate=DateTime.now, nullable=False)
    parent = relationship(Parent, backref='parent')
Run Code Online (Sandbox Code Playgroud)

当孩子更新时,我不仅Child.date_modified要更改,还要更改Child.parent.date_modified.

我试图这样做:

@event.listens_for(Child, 'after_update')
def modified_listener(mapper, connection, target):
    if object_session(target).is_modified(target, include_collections=False):
        target.parent.date_modified = DateTime.now()
Run Code Online (Sandbox Code Playgroud)

但这不起作用,因为我已经处于冲洗状态并且我得到了类似的东西

SAWarning: Attribute history events accumulated on 1 previously clean instance within inner-flush event handlers have been reset, and will not result in …
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy

5
推荐指数
2
解决办法
2256
查看次数

相关子项更改时,SQLAlchemy更新父项

我正在尝试将一个实体建模为一个或多个一对多关系,以便当其last_modified属性更新时

  • 一个孩子被添加或删除
  • 一个孩子被修改
  • 实体本身被修改

我整理了以下最小示例:

class Config(Base):
    __tablename__ = 'config'

    ID = Column('ID', Integer, primary_key=True)
    name = Column('name', String)
    last_modified = Column('last_modified', DateTime, default=now, onupdate=now)

    params = relationship('ConfigParam', backref='config')

class ConfigParam(Base):

    __tablename__ = 'config_params'

    ID = Column('ID', Integer, primary_key=True)
    ConfigID = Column('ConfigID', Integer, ForeignKey('config.ID'), nullable=False)

    key = Column('key', String)
    value = Column('value', Float)

@event.listens_for(Config.params, 'append')
@event.listens_for(Config.params, 'remove')
def receive_append_or_remove(target, value, initiator):
    target.last_modified = now()

@event.listens_for(ConfigParam.key, 'set')
@event.listens_for(ConfigParam.value, 'set')
def receive_attr_change(target, value, oldvalue, initiator):
    if target.config:
        # don't act …
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy

4
推荐指数
1
解决办法
1090
查看次数

标签 统计

python ×2

sqlalchemy ×2