你怎么让SQLAlchemy在更新CURRENT_TIMESTAMP上覆盖MySQL

时间:2010-03-15 21:22:41

标签: python mysql sqlalchemy

我继承了一个旧的数据库,该数据库设置了一个“on update CURRENT_TIMESTAMP”,放在一个只应描述项目创建的字段上。使用PHP我一直在UPDATE子句中使用“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 个答案:

答案 0 :(得分: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