Sqlalchemy - 根据另一列的更改更新列

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Sqlalchemy - 根据另一列的更改更新列相关的知识,希望对你有一定的参考价值。

我正在使用sqlalchemy,但发现难以搜索的文档。

我有这两列:

    verified = Column(Boolean, default=False)
    verified_at = Column(DateTime, nullable=True)

我想创建一个像这样的函数:

    if self.verified and not oldobj.verified:
        self.verified_at = datetime.datetime.utcnow
    if not self.verified and oldobj.verified:
        self.verified_at = None

我不知道在哪里放这样的代码。我可以把它放在应用程序中,但更喜欢model对象处理这个逻辑。

答案

我认为你所寻找的是一个Hybrid Property

from sqlalchemy.ext.hybrid import hybrid_property

class VerifiedAsset(Base):
    id = Column(Integer, primary_key=True)
    verified_at = Column('verified_at', String(24))

    @hybrid_property
    def verification(self):
        return self.verified_at;

    @verification.setter
    def verification(self, value):
        if value and not self.verification:
            self.verified_at = datetime.datetime.utcnow
        if not value and self.verification:
            self.verified_at = None
        # Presumably you want to handle your other cases here

您希望根据某些传入的新值以特定方式更新verified_at值。使用属性来包装基础值,并且仅在适当时更新,并且仅对您在db中实际持久存储的内容进行更新。

另一答案

您可以使用sqlalchemy的事件注册来放置这样的代码:http://docs.sqlalchemy.org/en/latest/core/event.html。基本上,您可以订阅Core和ORM中发生的某些事件。我认为这是一种管理你想要实现的目标的简洁方法。

您将使用listen_for()装饰器,以便在这些列更改时挂钩。

另一答案

阅读"Changing Attribute Behavior""ORM Events"是尝试解决此类问题的良好开端。

一种方法是设置一个更新时间戳的事件监听器:

@event.listens_for(MyModel.verified, 'set')
def mymodel_verified_set(target, value, oldvalue, initiator):
    """Set verified_at"""
    if value != oldvalue:
        target.verified_at = datetime.datetime.utcnow() if value else None

以上是关于Sqlalchemy - 根据另一列的更改更新列的主要内容,如果未能解决你的问题,请参考以下文章

根据 s-s-rS 中另一列的值更改数字格式

根据MySQL中另一列分组的另一列的顺序更新列

根据另一列的存在更新列

根据值是不是是另一列的子字符串来更新列值

如何根据另一列的单元格值由其他列动态更新A列

根据另一列的另一个值和/或另一行中的同一列更新设置值:-ORA 1427