【发布时间】:2022-04-11 13:28:56
【问题描述】:
我正在尝试学习如何将 prisma 与 psql 数据库一起使用。
我在使用 id 为 uuid 字符串的引用时遇到了问题。
我有一个用户模型:
model User {
id String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid
request Request?
createdAt DateTime @default(now()) @db.Timestamptz(6)
updatedAt DateTime @default(now()) @updatedAt @db.Timestamptz(6)
}
model Request {
id Int @id @default(autoincrement())
user User @relation(fields: [id], references: [id])
// I also tried making the relation field userId
createdAt DateTime @default(now()) @db.Timestamptz(6)
updatedAt DateTime @default(now()) @updatedAt @db.Timestamptz(6)
}
当我尝试迁移它时,我收到一条错误消息:
未能完全应用到影子数据库。错误:数据库错误: 错误:外键约束“Request_userId_fkey”不能 实施细节:关键列“userId”和“id”不兼容 类型:文本和 uuid。
prisma 文档没有显示使用 uuid 的示例。
他们给出的示例在 Profile 模型中具有第二个参数,其中 userId 作为 Int。我尝试将它添加到我的请求模型中(作为 int、作为字符串和作为 uuid)。这些都不起作用。
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
role Role @default(USER)
posts Post[]
profile Profile?
}
model Profile {
id Int @id @default(autoincrement())
bio String
user User @relation(fields: [userId], references: [id])
userId Int
}
如何在使用 uuid 生成 userId 时引用它?
segment of the prisma documentation 建议(如果我理解正确的话),任何 String 或 Int 或 enum 都应该能够识别 uuid:
关系型数据库对应数据库类型:PRIMARY KEY
可以用 @default() 值注释,该值使用函数来 自动生成 ID:
autoincrement() cuid() uuid() 可以在任何标量字段上定义 (字符串,整数,枚举)
当我尝试将 pgcrypto 扩展添加到 psql 时,我尝试再次运行迁移并得到一个错误消息较少,但仍然是类似的问题:
解析属性“@relation”时出错:
id中的字段类型 模型Request与引用字段id的类型不匹配 在模型User.
我见过this discussion,这表明以某种方式对棱镜撒谎。我不够聪明,无法理解谎言应该是什么或如何做到这一点。
github 上有人建议在请求模型中使用这种引用语法:
user User @relation(fields: [userId], references: [id])
userId String @unique @db.Uuid
我按照上面的方法进行了尝试,但没有使用 @unique 标志,但我仍然收到迁移错误,提示 uuid 和 text 是不兼容的引用。我找不到解决如何使 uuid 引用与关系模型兼容的 prisma 文档部分。
fyi:上述尝试的迁移文件显示以下内容:
CREATE TABLE "Request" (
"id" SERIAL NOT NULL,
"userId" UUID NOT NULL,
CONSTRAINT "Request_pkey" PRIMARY KEY ("id")
);
【问题讨论】:
-
我认为这个问题与prisma schama中的问号有关。我找不到那个角色做什么的定义。没有 和 有什么区别!并且存在一个?但是,使用 ?创建与上面的错误消息一起显示的问题。我还没有找到解决方案......只是一个线索
标签: psql prisma prisma-graphql