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

如何用Drizzle从JSON字段创建派生/计算列?

用Drizzle实现JSON嵌套字段的自动派生列

核心思路

借助PostgreSQL的**生成列(Generated Column)**特性,让数据库自动从data字段的JSON结构里提取start.id的值,同步维护到startId列,彻底替代手动处理的更新逻辑。

修改Drizzle表结构

把startId定义为持久化生成列(STORED),值会直接存在磁盘上,查询时无需重复计算。修改后的代码如下:

import { json, pgTableCreator, varchar } from "drizzle-orm/pg-core"

const createTable = pgTableCreator(
  (name) => `schema_${name}`,
)

const nodes = createTable("nodes", {
  // 其他原有字段保持不变
  data: json("data").notNull(),
  startId: varchar("start_id").generatedAlwaysAs(
    `(data->'start'->>'id')` // PostgreSQL JSON提取语法:->获取JSON对象,->>转成文本类型
  ).stored(),
})

关键细节说明

  • 生成列类型选择:.stored()表示持久化存储,每次data字段更新时,数据库会自动同步startId的值;如果用.virtual()则是查询时实时计算,适合JSON结构频繁变化或该列查询频率低的场景。
  • JSON提取语法:data->'start'->>'id'里,->用于访问JSON对象的属性(返回JSON类型),->>则直接返回文本类型,刚好匹配varchar列的类型要求。
  • 约束补充:如果start.id是必填内容,可以给startId加上.notNull(),但要确保data字段里的start.id不会缺失,否则会触发数据库约束错误。

已有表的迁移处理

如果是已经创建好的表,需要通过Drizzle迁移来添加生成列并回填历史数据:

  1. 生成迁移文件:npx drizzle-kit generate
  2. 执行迁移:npx drizzle-kit migrate
    数据库会自动为已有行计算startId的值,后续更新data时也会自动同步该列。

注意事项

  • 生成列的值由数据库自动维护,不能手动插入或更新,否则会触发报错。
  • 要保证data字段的JSON结构稳定,如果start.id的路径发生变化,需要同步修改生成列的表达式并重新执行迁移。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 13:53:15