使用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
相关产品推荐
相关产品推荐

