Dav*_*ite 7 python sqlalchemy sql-update
这是一个 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())
Run Code Online (Sandbox Code Playgroud)
每当我添加 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()
Run Code Online (Sandbox Code Playgroud)
但我真的宁愿让模型以自己的方式来做,而不是重新创建一个 Python 进程来手动更新日期。(例如,为了避免模型可能使用now()而手动功能错误使用的错误utcnow())
SQLAlchemy 有没有办法“触摸”一个记录(有点像 UNIX touch),它不会改变记录的任何其他值但会触发该onupdate=函数?
我没有查看源代码,但从文档来看,这似乎只能通过发出 SQLUPDATE命令来触发:
\n\n\nonupdate \xe2\x80\x93 标量、Python 可调用或 ClauseElement,表示要应用于 UPDATE 语句中的列的默认值,如果更新的 SET 子句中不存在此列,则将在更新时调用该默认值。这是使用 ColumnDefault 作为 for_update=True 的位置参数的快捷方式。
\n
如果您关心的是确保您的“触摸”使用与 onupdate您可以在模型上定义一个方法来执行触摸的函数相同的函数,并让onupdate参数指向该方法。
我认为这样的事情会起作用:
\n\nclass MyGroup(Base):\n __tablename__ = \'my_group\'\n group_id = Column(Integer, Sequence(\'my_seq\'), primary_key=True)\n group_name = Column(String(200), nullable=False, index=True)\n date_created = Column(DateTime, default=func.now())\n date_updated = Column(\n DateTime, \n default=self.get_todays_date,\n onupdate=self.get_todays_date)\n\n def get_todays_date(self):\n return datetime.datetime.utcnow()\n\n def update_date_updated(self):\n self.date_updated = self.get_todays_date()\nRun Code Online (Sandbox Code Playgroud)\n\n然后您可以像这样更新您的记录:
\n\ngroup.update_date_updated()\nsession.commit()\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
4014 次 |
| 最近记录: |