如何让SQLAlchemy覆盖MySQL的"on update CURRENT_TIMESTAMP
我接手了一个旧数据库,这个数据库在一个字段上设置了“更新时自动更新时间戳”,但这个字段其实应该只用来记录一个项目的创建时间。现在我在用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