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

如何在SQLAlchemy中以Mapped风格添加日期字段?默认值不生效问题

问题解决:SQLAlchemy日期字段设默认值后PostgreSQL仍提示必填

问题描述

当前日期字段的定义代码如下:

date: Mapped[date] = mapped_column(DATE, default=date.today)

其中date对应datetime.date类型,DATE为sqlalchemy.DATE。尽管已配置default参数,PostgreSQL仍提示该字段为必填项。

原因分析

default=date.today是ORM层面的默认值,仅在Python代码生成数据时生效,不会同步到PostgreSQL的表结构中。此时数据库里该字段仍被标记为NOT NULL,且未设置数据库端的默认值,因此插入数据时会触发必填校验。

解决方法

方案1:配置数据库端默认值(推荐)

使用SQLAlchemy的func.current_date()生成数据库层面的默认值,让PostgreSQL自动填充当前日期:

from sqlalchemy import func

date: Mapped[date] = mapped_column(DATE, server_default=func.current_date(), nullable=False)

这样会在PostgreSQL表结构中为该字段添加DEFAULT CURRENT_DATE约束,同时保留NOT NULL,数据库会自动处理默认值填充。

方案2:保留ORM默认值并允许字段为空

如果需要保留Python端的默认值逻辑,可设置字段允许为空(仅适用于业务允许空值的场景):

date: Mapped[date | None] = mapped_column(DATE, default=date.today, nullable=True)

这种情况下,插入数据时若未传值,ORM会自动填充date.today(),同时数据库不会触发必填校验。

核心区别

  • default:Python代码层面生成默认值,插入前由ORM赋值
  • server_default:数据库层面设置默认值,插入时由数据库自动赋值

内容的提问来源于stack exchange,提问作者Ch1irxo 17

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 07:52:32