You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用SQLAlchemy操作Postgres时,新建行created日期晚于updated日期的原因

问题原因及解决方案

核心问题:默认时间参数的错误写法

你在SQLAlchemy模型里给created和updated字段的default传了dt.utcnow(),这是直接调用函数并把返回值作为默认值,而非传入函数本身。这意味着当Python程序启动、Test类被加载的那一刻,这个时间就被固定下来了。后续创建新记录时,updated的默认值都是这个固定的旧时间,而你手动设置的created是当前的新时间,自然就出现created晚于updated的情况。

修复步骤

1. 修改模型字段定义

把default=dt.utcnow()改成default=dt.utcnow(去掉括号,传入函数引用,让SQLAlchemy在需要时才调用它):

class Test(db.Model):
    __tablename__ = 'tests'
    id = db.Column(db.Integer, primary_key=True)
    uuid = db.Column(db.String(36), index=True, default=lambda:str(uuid.uuid4()))
    payload = db.Column(MutableDict.as_mutable(JSONB))
    processed = db.Column(db.Boolean)
    # 去掉括号,传入函数本身
    created = db.Column(db.DateTime, default=dt.utcnow, nullable=False)
    # 同样修改default,onupdate写法本身是正确的
    updated = db.Column(db.DateTime, default=dt.utcnow, onupdate=dt.utcnow, nullable=False)

2. 验证创建逻辑

你创建数据时手动设置created的操作没问题,修改模型后,新创建的记录updated会取当前UTC时间,后续更新数据时,updated也会自动刷新为操作时的UTC时间。

额外时区对齐建议

如果要确保数据库与应用时间完全一致:

  • 保持存储层统一使用UTC时间(你当前用utctnow的做法很规范)
  • 查询后可根据需求转换为本地时区,但存储阶段始终用UTC
  • 确认Postgres数据库时区设置为UTC,可执行SHOW timezone;查看,必要时修改postgresql.conf中的timezone参数

内容的提问来源于stack exchange,提问作者Johnny John Boy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 08:57:24