【问题标题】:Flask Sqlalchemy how to not auto-update TIMSTAMP column when update a rowFlask Sqlalchemy 如何在更新行时不自动更新 TIMESTAMP 列
【发布时间】:2020-09-08 08:18:39
【问题描述】:

我有一个模型:

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)

但是,每次我更新namepassword 时,时间戳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 列中的值在创建行时固定,并且无论其他列中的值如何变化,该值都不应更改。

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

【问题讨论】:

    标签: mysql python-3.x flask-sqlalchemy flask-restful


    【解决方案1】:

    created_time 的列应为db.DateTime

    【讨论】:

    • 确实,我刚刚更新了昨天创建的一行信息,created_time 没有自动更新。但是如果我在其他服务中需要db.TIMESTMP,有没有办法阻止它自动更新?
    • db.TIMESTAMP 实际上并不是您在该参数中使用的列类型。 DateTime 已经足够了,并且可以感知时区。如果对您有帮助,请将答案标记为已接受!
    • 你是对的。但我将使用db.TIMSTAMP 代替其他服务,我只是在Edit 1 中更清楚地说明了这一点。我遇到了上面说明的问题。因此,将类型从 db.TIMSTAMP 更改为 db.DateTime 并不能真正解决问题。我仍然需要知道是否有办法阻止db.TIMESTAMP 列自动更新其值。
    【解决方案2】:

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

    查看更多:Marking Implicitly Generated Values, timestamps, and Triggered Columns

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

    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:Define Output Column In Flask-Sqlalchemy

    在这里我找到了很好的参考资料,可以帮助您解决问题。 How to stop SQLAlchemy from adding an ON UPDATE clause to a TIMESTAMP column by default

    【讨论】:

      猜你喜欢
      • 2016-02-18
      • 1970-01-01
      • 2019-12-09
      • 2020-10-03
      • 2018-05-14
      • 1970-01-01
      • 2018-09-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多