gpt4 book ai didi

python - 如何在 SQLAlchemy 更新时更新相关对象?

转载 作者:太空宇宙 更新时间:2023-11-04 05:48:38 24 4
gpt4 key购买 nike

我在 Rule 和 RuleStats 对象之间存在一对一的关系。当规则上的任何字段更新时,我试图修改 RuleStats 上的 last_updated 字段。如果它们不是两个独立的类,它看起来会像这样。

class Rule(Base):
__tablename__ = 'rules'

def __init__(self, **kwargs):
Base.__init__(self, **kwargs)
self.stats = RuleStats(rule=self)

id = Column(Integer, autoincrement=True, primary_key=True)
description = Column(String, nullable=False, default='')
# ... more fields

last_updated = Column(DateTime, default=datetime.now, onupdate=datetime.now, nullable=False)

但是如果我有两个独立的对象,我该怎么做,

class Rule(Base):
__tablename__ = 'rules'

def __init__(self, **kwargs):
Base.__init__(self, **kwargs)
self.stats = RuleStats(rule=self)

id = Column(Integer, autoincrement=True, primary_key=True)
description = Column(String, nullable=False, default='')
# ... more fields

stats = relationship('RuleStats', uselist=False, backref='rule', cascade='all, delete-orphan')

class RuleStats(Base):
__tablename__ = 'rule_stats'

def __init__(self, **kwargs):
Base.__init__(self, **kwargs)

rule_id = Column(Integer, ForeignKey('rules.id'), primary_key=True)
last_updated = Column(DateTime, default=datetime.now, nullable=False)

最佳答案

我认为最简单的方法是

  • 创建函数 Rule.update() 并仅通过应用程序中的此特定函数进行更新。示例:

    from sqlalchemy.orm.attributes import set_attribute

    class Rule:

    def update(self, **kwargs):
    """Update instance attributes and bump last_modified date in stats"""
    for key, value in kwargs.items():
    set_attribute(self, key value)
    self.stats.last_updated = now()

然后:

 rule.update(description="Python rocks!")

如果你想让它对用户透明,以便 RuleState 总是更新,即使你直接戳 Rule 属性,你可以使用 Python properties为了这。然而,这种方法会导致更复杂的代码库,我不推荐它。

或者,您可以使用数据库触发器在数据库端执行更新。 Update trigger example for PostgreSQL .

很可能存在一种在高级 SQLAlchemy 内部执行此操作的方法,但我没有足够的洞察力来判断从哪里开始戳。

关于python - 如何在 SQLAlchemy 更新时更新相关对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31212392/

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