为何Prisma要求传入已设默认值的属性?NestJS+PostgreSQL问题
问题原因及解决方案
核心原因
你的问题主要源于两个关键点:
- 未更新Prisma客户端:修改Prisma Schema后,必须重新生成客户端代码,否则TypeScript类型定义还是旧版本,无法识别新的默认值配置。
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
相关产品推荐
相关产品推荐

