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

如何在Prisma中添加纯时间属性并正确写入纯时间值?

如何在Prisma的playlist模型中为duration字段传入纯时间值而非DateTime?

问题描述

我定义了如下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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 23:17:37