首页 > 解决方案 > Flask Sqlalchemy 如何在更新行时不自动更新 TIMSTAMP 列

问题描述

我有一个模型:

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String, nullable=False)
    password = db.Column(db.String, nullable=False)
    created_time = db.Column(db.TIMESTAMP, nullable=False)

但是,每次我更新nameorpassword时,时间戳created_time都会更新,但我不想created_time更新。

# the way I update a user's info
class UserController(Resource):
    def get(self):
        user = User.query.filter_by(id=1).first()  # a user had been created before
        user.name = "new_name"
        db.session.commit()  
       # as of here, not only `name` but also `created_time` will be update

created_time更新行时如何停止自动更新?


编辑 1

更准确地说,我想了解 的机制db.TIMESTAMP,更具体地说,是为了解决当我更新行中的其他列时db.TIMESTAMP也会更新的问题。

相反,我希望在db.TIMESTAMP创建行时固定列中的值,并且无论其他列中的值如何更改,该值都不应更改。

PS为了避免误解,我知道TIMESTAMP可能不是最适合created_time列的类型,但上面的代码仅用于说明目的。

标签: mysqlpython-3.xflask-sqlalchemyflask-restful

解决方案


好吧,据我了解,导致您的问题的 on_update 事件触发器不是默认值,并且不应该在没有明确告知的情况下生成它。

查看更多:标记隐式生成的值、时间戳和触发列

创建创建/修改时间戳的理想方法是这样的

class Base():
    id = db.Column(db.Integer, primary_key=True)
    created_time = db.Column(db.DateTime, server_default=db.func.now())
    modified_time = db.Column(db.DateTime, server_default=db.func.now(), onupdate=db.func.now())

src:在 Flask-Sqlalchemy 中定义输出列

在这里,我找到了很好的参考资料,可以帮助您解决问题。 默认情况下,如何阻止 SQLAlchemy 将 ON UPDATE 子句添加到 TIMESTAMP 列


推荐阅读