无效的 `prisma.mytable.create()` 调用:使用 cockroachdb 时,字段上的外键约束失败:“(不可用)”

Nat*_*han 3 cockroachdb prisma

我正在尝试在本地使用 Prisma 和 Cockroachdb 。据我所知,对 CockroachDB 的官方支持正在进行中。

我有一个并行的本地 PostgreSQL 数据库,其中一切工作正常,并且我能够生成 Prisma 迁移以针对 Cockroachdb 手动运行。所有这些都有效,我最终得到了两个明显相同的模式。

但是,Prisma 中使用该connect功能的任何创建操作都会失败,并出现以下错误:

Invalid `prisma.mylinkedtable.create()` invocation:
  Foreign key constraint failed on the field: `(not available)`
Run Code Online (Sandbox Code Playgroud)

以下是我的 schema.prisma 的关键部分:

datasource db {
  provider = "postgresql"
  url      = "postgresql://user:pass@localhost:26257/mydb"
}

generator client {
  provider = "prisma-client-js"
  previewFeatures = ["cockroachdb"]
}

model MyLinkedEntity {
  id           Int      @id @default(autoincrement())
  myEntity     MyEntity  @relation(fields: [myEntityId], references: [id])
  myEntityId    Int
  // ...
}

model MyEntity {
  id             Int           @id @default(autoincrement())
  // ...
}
Run Code Online (Sandbox Code Playgroud)

触发外键约束的代码:

const entity = await prisma.myEntity.findFirst({})
    
await prisma.myLinkedEntity.create({
    data: {
        myEntityId: entity.id,
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我稍微不同地处理它并尝试使用该connect功能进行链接:

await prisma.myLinkedEntity.create({
    data: {
        myEntity: {
            connect: {
                id: entity.id
            }
        },
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

我收到一个不同的错误:

Invalid `prisma.myLinkedEntity.create()` invocation:


  An operation failed because it depends on one or more records that were required but not found. No 'MyEntity' record(s) (needed to inline the relation on 'MyLinkedEntity' record(s)) was found for a nested connect on one-to-many relation 'MyEntityToMyLinkedEntity'.
Run Code Online (Sandbox Code Playgroud)

是什么赋予了?

raf*_*iss 5

看起来相关行并未首先创建。

您可以尝试使用connectOrCreate吗?https://www.prisma.io/docs/concepts/components/prisma-client/relation-queries#connect-or-create-a-record

Prisma 模型也可能存在问题。我不确定顺序是否重要,但我注意到您在它引用的 ID 之前定义了关系。

最后一点,不相关的一点:您不应该使用自动递增整数作为 CockroachDB 中的键。请参阅https://www.cockroachlabs.com/docs/v21.2/schema-design-table#primary-key-best-practices