我正在学习如何在psql数据库中使用prisma。
我遇到了一个使用引用的问题,其中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)
}
当我试图迁移它时,我会得到一个错误,即:
未能干净地应用于阴影数据库。错误: db错误:错误:不能详细实现外键约束"Request_userId_fkey“:键列"userId”和"id“是不兼容的类型: text和uuid。
prisma文档没有显示使用uuid的示例。
他们给出的示例在配置文件模型中有第二个参数,其中有一个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时,如何引用它?
此prisma文件部分建议(如果我理解正确的话),任何字符串、Int或枚举都应该用于识别uuid:
对应数据库类型的关系数据库:主键 可以用@default()值注释,该值使用函数自动生成ID: 自动增量() cuid() uuid()可以在任何标量字段(String,Int,enum)上定义。
当我尝试将pgcrypto扩展添加到psql中时,我尝试再次运行迁移并获得一个包含较少详细消息传递的错误,但仍然存在类似的问题:
错误解析属性"@relation":模型
id
中的字段Request
的类型与模型User
中引用的字段id
的类型不匹配。
我见过这一讨论,它暗示我在某种程度上对普丽斯玛撒谎。我不够聪明,无法理解谎言应该是什么或如何做的要点。
github上有人建议在请求模型中使用这个引用语法:
user User @relation(fields: [userId], references: [id])
userId String @unique @db.Uuid
我尝试了上面的方法,并且没有@唯一标志,但是我仍然得到一个迁移错误,它说uuid和text是不兼容的引用。我找不到prisma文档中关于如何使uuid引用与关系模型兼容的部分。
fyi:上述尝试的迁移文件显示了以下内容:
CREATE TABLE "Request" (
"id" SERIAL NOT NULL,
"userId" UUID NOT NULL,
CONSTRAINT "Request_pkey" PRIMARY KEY ("id")
);
发布于 2022-04-11 05:28:56
我认为费利克斯黑格尔回答是解决办法。我可以添加您应该删除失败的生成迁移sql (通过删除文件夹),并在修复问题后再次尝试它。
https://stackoverflow.com/questions/71043504
复制相似问题