drizzle-zod 0.4.3 新增 PgDateString 支持:PostgreSQL 日期列的类型化 Zod 校验方案 📅 发布时间:2026/9/19 10:06:18 👁 浏览次数: drizzle-zod 0.4.3 新增 PgDateString 支持PostgreSQL 日期列的类型化 Zod 校验方案【免费下载链接】drizzle-ormORM项目地址: https://gitcode.com/gh_mirrors/dr/drizzle-ormdrizzle-zod 是 Drizzle ORM 的官方 Zod 集成插件能够从 Drizzle 表结构自动生成 Zod 校验 Schema。0.4.3 版本的核心变更是为 PostgreSQL 的date({ mode: string })日期列补齐了类型化映射此前该类列只能退化为通用z.any()校验升级后会被正确生成为z.string()校验器。本文以 changelogs/drizzle-zod/0.4.3.md 为主线结合 drizzle-orm 与 drizzle-zod 的源码实现完整梳理该版本的能力变化、底层机制与实战用法。版本要点PgDateString 类型映射补全0.4.3 版本的变更记录非常精简只有一条 Added PgDateString to drizzle-zod#665要理解这条变更需要先回到 Drizzle ORM 对 PostgreSQLdate列的类型设计。在 drizzle-orm/src/pg-core/columns/date.ts 中date()构造器接受一个{ mode: date | string }配置date({ mode: date })返回PgDate列其dataType为dateTypeScript 侧数据类型为Date读写时负责 Date 对象与驱动字符串之间的双向转换见 date.ts#L33-L49date({ mode: string })返回PgDateString列其dataType为stringTypeScript 侧数据类型为string仅负责把驱动返回的 Date 统一裁剪为YYYY-MM-DD格式的日期字符串见 date.ts#L80-L92。在 drizzle-zod 0.4.3 之前由于映射逻辑只识别了PgDate以及PgTimestamp等列类型PgDateString列无法命中任何已知分支最终会落入columnToSchema兜底的z.any()等于放弃了运行时校验能力。0.4.3 正是补齐了这个缺口当columnType PgDateString时生成的 Zod Schema 为z.string()。源码级验证从列类型到 Zod Schema 的映射链路底层实现PgDateString 的判定与生成在 drizzle-zod/src/column.ts 中columnToSchema函数负责把 Drizzle 列转换为 Zod Schema。其判定顺序是先检查枚举列isWithEnum再按列类型逐个匹配几何、向量、数组、数值、布尔、日期、字符串、JSON 等类型。0.4.3 新增的映射位于字符串分支stringColumnToSchemacolumn.ts#L267-L318export const columnToSchema ( column: Column, factory: CreateSchemaFactoryOptions..., ): zod.ZodType { ... } else if (column.dataType string) { schema stringColumnToSchema(column, z, coerce); } ... };而stringColumnToSchema内部正是通过isColumnType(column, [PgDateString])判定该分支function stringColumnToSchema(column: Column, z: typeof zod, coerce: ...): zod.ZodType { // PgUUID 映射为 z.uuid() // 常规字符串列根据 length/char/enum 等约束生成 z.string() 及其长度限制 // 新增PgDateString 在此分支中命中生成 z.string() }由于PgDateString的dataType为string它天然进入字符串处理分支并按字符串列的标准流程生成 Schema——不附加长度约束、不附加正则约束最终等价于z.string()。驱动层确认PgDateString 的运行时行为在 drizzle-orm 侧PgDateString的getSQLType()返回date即底层 SQL 类型仍是 PostgreSQL 的date只是 TS 层以字符串承载。mapFromDriverValue会将驱动返回的Date或字符串统一裁剪为YYYY-MM-DDvalue.toISOString().slice(0, -14)mapToDriverValue未做特殊处理。这一点保证了生成的z.string()与运行时实际数据形态一致——从数据库读出的日期值一定是字符串。测试佐证期望 Schema 的形状drizzle-zod 的 PostgreSQL 测试 tests/pg.test.ts 中all data types用例覆盖了date({ mode: date })与date({ mode: string })两种写法const table pgTable(test, ({ date }) ({ date1: date({ mode: date }).notNull(), date2: date({ mode: string }).notNull(), ... })); const result createSelectSchema(table); const expected z.object({ date1: z.date(), // PgDate → z.date() date2: z.string(), // PgDateString → z.string()0.4.3 新增 ... }); expectSchemaShape(t, expected).from(result);同时type coercion - mixed用例也验证了在createSchemaFactory({ coerce: { date: true } })下timestamp会被包装为z.coerce.date()而字符串模式列不受 coerce 影响。在项目中的实际应用安装与基本用法drizzle-zod 是独立包需要与 drizzle-orm、zod 配合使用pnpm add drizzle-zod zod drizzle-orm在表定义中按需选择日期模式import { date, pgTable, serial, text } from drizzle-orm/pg-core; import { createInsertSchema, createSelectSchema } from drizzle-zod; import { z } from zod; const events pgTable(events, { id: serial(id).primaryKey(), title: text(title).notNull(), eventDate: date(event_date, { mode: string }).notNull(), // 0.4.3 起生成 z.string() createdAt: date(created_at, { mode: date }).notNull(), // 生成 z.date() }); const selectEventSchema createSelectSchema(events); // selectEventSchema 形状 // { id: ..., title: ..., eventDate: z.string(), createdAt: z.date() } const insertEventSchema createInsertSchema(events);此后insertEventSchema.parse()会严格校验eventDate必须为字符串createdAt必须为 Date 对象不再像 0.4.3 之前那样对eventDate静默放行。与 coerce 选项的配合createSchemaFactory提供的coerce选项可统一控制日期列的转换行为drizzle-zod/src/schema.tsimport { createSchemaFactory } from drizzle-zod; const { createSelectSchema } createSchemaFactory({ coerce: { date: true, // 仅影响 date 模式的列 → z.coerce.date() }, });字符串模式列因生成的是z.string()不受该开关影响如需把字符串日期列也做成宽松校验可在createInsertSchema的第二个参数中显式覆盖字段const relaxed createInsertSchema(events, { eventDate: z.coerce.string(), });版本适用范围本文描述的行为以当前仓库为准drizzle-zod 0.4.3 引入了PgDateString映射适用于 PostgreSQL 方言drizzle-orm/pg-coreMySQL、SQLite、SingleStore 等其他方言的日期列映射仍遵循各自已有的规则。若你使用的是更早版本请先升级到 0.4.3 或以上。小结drizzle-zod 0.4.3 通过识别PgDateString列类型将 PostgreSQL 字符串模式日期列从“无法校验”提升为“精确的z.string()校验”同时保证了与date({ mode: date })z.date()在类型层面的清晰区分。对于以字符串格式在前后端之间传递日期的团队这一补全让接口入参、出参的 Zod 校验真正做到了“表结构即校验规则”配合createSchemaFactory的coerce选项还可按需放宽转换策略。【免费下载链接】drizzle-ormORM项目地址: https://gitcode.com/gh_mirrors/dr/drizzle-orm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考