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

为何Prisma要求传入已设默认值的属性?NestJS+PostgreSQL问题

问题原因及解决方案

核心原因

你的问题主要源于两个关键点:

  1. 未更新Prisma客户端:修改Prisma Schema后,必须重新生成客户端代码,否则TypeScript类型定义还是旧版本,无法识别新的默认值配置。
  2. dbgenerated的特殊行为:bookId使用了@default(dbgenerated("gen_random_uuid()")),该配置是让数据库层面生成默认值,但Prisma客户端不会自动将该字段标记为可选——它默认认为你需要显式传入值,除非使用Prisma内置的客户端生成默认值(如uuid())。

解决方案

步骤1:重新生成Prisma客户端(必做)

无论采用哪种方案,先执行以下命令更新客户端类型:

npx prisma generate

这会根据最新的Schema重新生成@prisma/client中的类型定义,确保TypeScript能识别默认值配置。

方案1:改用Prisma客户端生成UUID(推荐)

如果不需要依赖数据库的gen_random_uuid(),可以把bookId的默认值改成Prisma内置的uuid()函数,客户端会自动生成UUID,同时将bookId标记为可选字段:

model Book {
  bookId           String             @id(map: "pk_book") @default(uuid()) @db.VarChar(80)
  bookTitle        String             @unique(map: "unique_name_books") @db.Citext
  coverUrl         String?            @db.VarChar(100)
  bookStatus       String             @default("active") @db.VarChar(10)
  book_author      Book_author[]
  collections_book Collections_book[]
}

修改后再次执行npx prisma generate,之后你的创建代码就能正常省略bookId和bookStatus。

方案2:保留数据库默认值,使用uncheckedCreate

如果必须依赖数据库的gen_random_uuid(),可以使用Prisma的uncheckedCreate方法绕开客户端类型校验(客户端无法识别数据库层面的默认值):

const bookId: BookIdDto = await this.prisma.book.uncheckedCreate({
  data: {
    bookTitle: data.bookTitle,
    coverUrl: null,
  }
});

return bookId;

注意:uncheckedCreate会跳过Prisma的部分校验,使用前需确认数据库已正确配置对应字段的默认值。

额外验证

确认PostgreSQL数据库中,bookId字段确实设置了默认值gen_random_uuid(),bookStatus设置了默认值'active'——可通过数据库客户端查看表结构进行验证。

内容的提问来源于stack exchange,提问作者Santiago Gómez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 22:13:41