如何在Prisma中添加纯时间属性并正确写入纯时间值?
问题描述
我定义了如下Prisma模型:
model playlist { id Int @id @default(autoincrement()) list String @db.VarChar(34) duration DateTime? @db.Time(0) }
我希望在创建新记录时为duration字段添加纯时间值,但目前似乎只能传入DateTime类型的值。我尝试直接传入字符串形式的时间值(如'00:01:29'),但操作失败,出现了如下错误:
Argument duration: Got invalid value '00:01:29' on prisma.createOneplaylist. Provided String, expected DateTime or Null.
请问是否存在仅传入纯时间值的可行方式,还是我必须使用DateTime格式来赋值?
解决方案
问题的核心在于你的Schema定义存在「客户端类型」和「数据库存储类型」的不匹配:你用@db.Time(0)指定数据库存储为时间类型,但客户端层面Prisma仍将duration识别为DateTime类型,所以纯时间字符串会被校验拦截。这里有两种可行的解决办法:
1. 传入带日期占位的完整ISO DateTime字符串
你可以构造一个包含固定日期(比如Unix纪元起始日1970-01-01)的完整DateTime字符串,Prisma会接受这个格式,而数据库会自动只存储时间部分(因为你配置了@db.Time(0))。示例代码:
// 假设使用JavaScript客户端 await prisma.playlist.create({ data: { list: "my-playlist", duration: "1970-01-01T00:01:29" } })
2. 改用Prisma原生Time类型(推荐)
从Prisma 2.19版本开始,支持原生的Time类型,它直接对应数据库的时间类型,客户端层面也会接受纯时间字符串。你只需要修改Schema中的字段类型:
model playlist { id Int @id @default(autoincrement()) list String @db.VarChar(34) duration Time? @db.Time(0) // 将DateTime?改为Time? }
修改后重新生成Prisma客户端,之后就可以直接传入纯时间字符串了:
await prisma.playlist.create({ data: { list: "my-playlist", duration: "00:01:29" } })
⚠️ 注意:这种方式需要你的数据库支持原生时间类型(比如MySQL的TIME、PostgreSQL的TIME等),并且Prisma版本不低于2.19。
内容的提问来源于stack exchange,提问作者Benni

