【问题标题】:SQLAlchemy date field not updating with server_onupdateSQLAlchemy 日期字段未使用 server_onupdate 更新
【发布时间】:2021-06-23 11:19:07
【问题描述】:

将 SQLAlchemy 与 flask_sqlalchemy 和用于 PostgreSQL 的 alembic 一起使用。我对字段有以下定义:

date_updated = db.Column(db.DateTime, server_default=db.func.now(), server_onupdate=db.func.now())

但是,当记录被修改时,该字段永远不会更新。它设置在创建并且从不更新。这是 alembic 生成的用于创建表的内容:

sa.Column('date_updated', sa.DateTime(), server_default=sa.text('now()'), nullable=True),

所以它没有被更新也就不足为奇了,因为 server_onupdate 参数似乎没有超过 alembic。

我不确定执行此操作的正确方法。 SQLAlchemy 文档非常复杂,并且不清楚这涉及到什么地方。

编辑:从直接在 PostgreSQL 中查看如何执行此操作,看起来它需要使用触发器。如果可能的话,我宁愿在数据库级别而不是在应用程序级别执行此操作,但我不知道是否可以通过 SQLAlchemy 添加触发器。我可以直接将它添加到数据库中,但在应用迁移时可能会中断。

【问题讨论】:

    标签: sqlalchemy alembic


    【解决方案1】:

    你说“我不确定这样做的正确方法”的方式,我不确定你是指专门更新服务器端的日期,还是只是一般地更新它。

    如果你只是想更新它并且不管如何,我认为最干净的方法是使用事件监听器。

    这是一个使用普通sqlalchemy 的示例,它可能与flask-sqlalchemy 中的相同(或至少非常相似):

    from datetime import datetime
    from sqlalchemy import event
    
    @event.listens_for(YourModel, 'before_insert')
    @event.listens_for(YourModel, 'before_update')
    def date_insert(mapper, connection, target):
        target.date_updated = datetime.utcnow()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-04
      • 1970-01-01
      • 2018-02-14
      • 1970-01-01
      • 1970-01-01
      • 2017-11-29
      • 1970-01-01
      相关资源
      最近更新 更多