Mel*_*Mel 8 psql prisma prisma-graphql
我正在尝试学习如何将 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)
}
Run Code Online (Sandbox Code Playgroud)
当我尝试迁移它时,我收到一条错误消息:
无法干净地应用到影子数据库。错误:数据库错误:错误:无法实现外键约束“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
}
Run Code Online (Sandbox Code Playgroud)
当使用 uuid 生成 userId 时,如何引用它?
prisma 文档的这一部分建议(如果我理解正确的话),任何 String 或 Int 或 enum 都应该可以识别 uuid:
关系数据库对应的数据库类型:PRIMARY KEY
可以用 @default() 值进行注释,该值使用函数自动生成 ID:
autoincrement() cuid() uuid() 可以在任何标量字段上定义(String、Int、enum)
当我尝试将 pgcrypto 扩展添加到 psql 时,我尝试再次运行迁移并收到一个错误,该错误的消息传递较少,但仍然存在类似的问题:
id解析属性“@relation”时出错:模型中字段的类型与 模型中Request引用字段的类型不匹配。idUser
我看过这个讨论,它暗示以某种方式向棱镜撒谎。我不够聪明,无法理解谎言的要点或如何做到这一点。
github 上有人建议在请求模型中使用此引用语法:
user User @relation(fields: [userId], references: [id])
userId String @unique @db.Uuid
Run Code Online (Sandbox Code Playgroud)
我按照上面的方法进行了尝试,并且没有 @unique 标志,但我仍然收到迁移错误,指出 uuid 和文本是不兼容的引用。我找不到 prisma 文档中解决如何使 uuid 引用与关系模型兼容的部分。
仅供参考:上述尝试的迁移文件显示以下内容:
CREATE TABLE "Request" (
"id" SERIAL NOT NULL,
"userId" UUID NOT NULL,
CONSTRAINT "Request_pkey" PRIMARY KEY ("id")
);
Run Code Online (Sandbox Code Playgroud)
Fel*_*iel 10
您必须使用@db.Uuid参考列上的注释userId,请在此处阅读更多相关信息。
例子:
model Request {
id Int @id @default(autoincrement())
user User @relation(fields: [userId], references: [id])
userId String @db.Uuid // <-- the difference is here
...your other stuff
}
Run Code Online (Sandbox Code Playgroud)
小智 0
我遇到了类似的错误,这是因为我没有将示例中关系 ID 的类型从 更改为Int。String
如果将请求模型更新为如下所示,它可以工作吗?
model Request {
id Int @id @default(autoincrement())
user User @relation(fields: [id], references: [id])
userId String // <- this was missing
createdAt DateTime @default(now()) @db.Timestamptz(6)
updatedAt DateTime @default(now()) @updatedAt @db.Timestamptz(6)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12153 次 |
| 最近记录: |