Недопустимый вызов `prisma.mytable.create()`: ошибка ограничения внешнего ключа в поле: `(недоступно)` при использовании cockroachdb

#prisma #cockroachdb

#prisma #cockroachdb

Вопрос:

Я пытаюсь использовать Prisma с Cockroachdb локально. Я понимаю, что официальная поддержка CockroachDB находится в разработке.

У меня есть параллельная локальная база данных PostgreSQL, где все работает правильно, и я могу генерировать миграции Prisma для запуска вручную в Cockroachdb. Все это работает, и в итоге я получаю две, по-видимому, идентичные схемы.

Однако любая операция создания в Prisma с использованием connect функции завершается ошибкой со следующей ошибкой:

 Invalid `prisma.mylinkedtable.create()` invocation:
  Foreign key constraint failed on the field: `(not available)`
 

Вот ключевые части моей схемы.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())
  // ...
}
 

Код, который запускает ограничение внешнего ключа:

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

Если я сделаю это немного по-другому и попытаюсь связать с помощью connect функции:

 await prisma.myLinkedEntity.create({
    data: {
        myEntity: {
            connect: {
                id: entity.id
            }
        },
        // ...
    }
}
 

Я получаю другую ошибку:

 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'.
 

Что дает?

Ответ №1:

Похоже, что связанные строки не создаются первыми.

Не могли бы вы попробовать использовать connectOrCreate вместо этого? https://www.prisma.io/docs/concepts/components/prisma-client/relation-queries#connect-or-create-a-record

Это также может быть что-то не так с моделью Prisma. Я не уверен, имеет ли значение порядок, но я заметил, что у вас есть отношение, определенное перед идентификатором, на который оно ссылается.

Последний, несвязанный момент: вы не должны использовать автоинкрементные целые числа в качестве ключей в CockroachDB. См. https://www.cockroachlabs.com/docs/v21.2/schema-design-table#primary-key-best-practices