我是否可以触动"ON"Y记录以触发";onUPDATE&QOT;? [英] Can I "touch" a SQLAlchemy record to trigger "onupdate"?
本文介绍了我是否可以触动"ON"Y记录以触发";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()
这篇关于我是否可以触动"ON"Y记录以触发";onUPDATE&QOT;?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文