gpt4 book ai didi

python - 相关子项更改时 SQLAlchemy 更新父项

转载 作者:太空狗 更新时间:2023-10-30 02:44:33 25 4
gpt4 key购买 nike

我正在尝试将一个实体建模为一个或多个一对多关系,这样它的 last_modified 属性就会更新,当

  • 添加或删除一个 child
  • 修改了一个 child
  • 实体本身被修改

我整理了以下最小示例:

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 if the parent config isn't yet set
# i.e. during __init__
target.config.last_modified = now()

这似乎可行,但我想知道是否有更好的方法来做到这一点?

具体来说,这变得非常冗长,因为我的实际 ConfigParam 实现具有更多属性,并且我在父 Config 类上配置了多个一对多关系。

最佳答案

对此持保留态度,它“似乎”有效,但可能会爆炸:

def rel_listener(t, v, i):
t.last_modified = now()

def listener(t, v, o, i):
if t.config:
t.config.last_modified = now()

from sqlalchemy import inspect

for rel in inspect(Config).relationships:
event.listen(rel, 'append', rel_listener)
event.listen(rel, 'remove', rel_listener)

for col in inspect(ConfigParam).column_attrs:
event.listen(col, 'set', listener)

问题是检查没有异常,并且“ID”和“ConfigID”等列将绑定(bind)到事件监听器。

另一种可能稍微不那么乏味的形式是仅使用属性列表以类似的方式将事件绑定(bind)到:

for attr in ['key', 'value']:
event.listen(getattr(ConfigParam, attr), 'set', listener)

这使您可以控制哪些绑定(bind)到事件,哪些不绑定(bind)。

关于python - 相关子项更改时 SQLAlchemy 更新父项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29011310/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com