如何让SQLAlchemy覆盖MySQL的"on update CURRENT_TIMESTAMP

3 投票
1 回答
2951 浏览
提问于 2025-04-15 20:28

我接手了一个旧数据库,这个数据库在一个字段上设置了“更新时自动更新时间戳”,但这个字段其实应该只用来记录一个项目的创建时间。现在我在用PHP的时候,会在更新的语句里写“timestamp=timestamp”,这样可以保持时间戳不变。但是在SQLAlchemy中,我似乎无法强制系统使用我设置的时间戳。

难道我没有其他选择,只能更新MySQL表格(有几百万行数据)吗?

foo = session.query(f).get(int(1))
ts = foo.timestamp
setattr(foo, 'timestamp', ts)
setattr(foo, 'bar', bar)
www_model.www_Session.commit()

我也尝试过:

foo = session.query(f).get(int(1))
setattr(foo, 'timestamp', foo.timestamp)
setattr(foo, 'bar', bar)
www_model.www_Session.commit()

1 个回答

6

SQLAlchemy(一个数据库工具)不会去更新某个字段,因为它认为这个值没有变化。

你可以通过在列上设置一个叫做 onupdate 的属性来告诉 SQLAlchemy 重新赋值:

 Column('timestamp', ..., onupdate=literal_column('timestamp'))

这样一来,SQLAlchemy 就会在所有的更新查询中自动加上 timestamp=timestamp

如果你只想在某个特定实例上做一次更新,可以直接把这个列的值赋给它:

foo.timestamp = literal_column('timestamp')
# or 
foo.timestamp = foo_tbl.c.timestamp

撰写回答