Prisma中如何给模型添加无关联的对象数组字段?
实现方案
Prisma本身不支持直接定义无关联的对象数组字段,但可以靠PostgreSQL的JSONB类型搞定,具体步骤如下:
1. 修改Prisma Schema
把User模型里的favorites字段定义成Json类型(对应PostgreSQL的JSONB),默认值设为空数组:
model User { id Int @id @default(autoincrement()) // 其他字段按需保留 favorites Json @default("[]") @db.JsonB }
2. 同步数据库结构
跑下面的命令生成迁移并更新数据库:
npx prisma migrate dev --name add-favorites-jsonb
3. 补全类型安全(可选但实用)
虽然不能用Prisma的type定义,但可以自己写TypeScript类型来避免操作数组时出错:
type FavoriteItem = { id: number; title: string; }; // 查询后转成定义好的类型 const user = await prisma.user.findUnique({ where: { id: 1 } }); const favorites = user?.favorites as FavoriteItem[];
4. 实际操作示例
- 创建带收藏列表的用户:
await prisma.user.create({ data: { // 填其他必填字段 favorites: [{ id: 1, title: 'blah' }, { id: 2, title: 'ok' }] } });
- 更新用户的收藏列表:
await prisma.user.update({ where: { id: 1 }, data: { favorites: [{ id: 3, title: 'new track' }] } });
注意点
- JSONB支持PostgreSQL的原生查询,比如用
jsonb_array_elements查数组元素,但Prisma客户端要查的话得用raw或者结合类型断言做过滤。 - 这种存储方式没有数据库外键约束,数据一致性得自己在业务代码里处理。
内容的提问来源于stack exchange,提问作者Zio-4
相关产品推荐
相关产品推荐

