Prisma 与 psql db - 不兼容的类型:文本和 uuid

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)


Sim*_*mon 9

我想补充一点,对于可能遇到这种情况的其他人,如果您遇到此问题并且似乎所做的一切都是正确的,那么您的项目中很可能存在来自失败迁移的工件。

不要忘记同时删除失败的迁移


小智 0

我遇到了类似的错误,这是因为我没有将示例中关系 ID 的类型从 更改为IntString

如果将请求模型更新为如下所示,它可以工作吗?

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)