我是否可以触动&QUOTON&QUOTY记录以触发"onUPDATE&QOT;? [英] Can I "touch" a SQLAlchemy record to trigger "onupdate"?

查看:0
本文介绍了我是否可以触动&QUOTON&QUOTY记录以触发"onUPDATE&QOT;?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这里有一个SQLAlChemy类:

class MyGroup(Base):
    __tablename__ = 'my_group'
    group_id = Column(Integer, Sequence('my_seq'), primary_key=True)
    group_name = Column(String(200), nullable=False, index=True)
    date_created = Column(DateTime, default=func.now())
    date_updated = Column(DateTime, default=func.now(), onupdate=func.now())
每当我添加GROUP_NAME或(例如)更新GROUP_NAME时,date_updated字段将被更新。太棒了。

但有时我希望将组标记为"已更新",即使组记录本身没有更改(例如,如果更新了不同但相关表中的数据)。

我可以手动完成:

group = session.query(MyGroup).filter(MyGroup.group_name=='Some Group').one()
group.date_updated = datetime.datetime.utcnow()
session.commit()

但我真的更愿意让模型以自己的方式完成这项工作,而不是重新创建一个Python流程来手动更新日期。(例如,为了避免可能模型使用now()而手动函数错误使用utcnow()这样的错误)

使用SQLAlChemy是否有一种方法可以"接触"记录(有点像Unixtouch),而不会更改该记录的任何其他值,但会触发onupdate=函数?

推荐答案

我还没有查看源代码,但从docs看起来这只是通过发出SQLUPDATE命令才能触发的:

OnUPDATE-标量、可调用的Python或ClauseElement,表示要应用于UPDATE语句中的列的默认值,如果该列不在UPDATE的SET子句中,则将在UPDATE时调用。这是将ColumnDefault用作For_UPDATE=True的位置参数的快捷方式。

如果您关心的是确保您的"触摸"使用与onupdate函数相同的函数,您可以在模型上定义一个方法来执行触摸,并让onupdate参数指向此方法。

我认为这样的方法会奏效:

class MyGroup(Base):
    __tablename__ = 'my_group'
    group_id = Column(Integer, Sequence('my_seq'), primary_key=True)
    group_name = Column(String(200), nullable=False, index=True)
    date_created = Column(DateTime, default=func.now())
    date_updated = Column(
        DateTime,     
        default=self.get_todays_date,
        onupdate=self.get_todays_date)

    def get_todays_date(self):
        return datetime.datetime.utcnow()

    def update_date_updated(self):
        self.date_updated = self.get_todays_date()

然后您可以这样更新您的记录:

group.update_date_updated()
session.commit()

这篇关于我是否可以触动&QUOTON&QUOTY记录以触发"onUPDATE&QOT;?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆