Удалите все элементы в таблице с помощью Prisma2 и Jest

Я хотел бы знать, как я могу удалить все элементы в таблице с помощью Prisma2 и Jest?

Я прочитал документацию CRUD и пытаюсь сделать следующее:

user.test.js

....
import { PrismaClient } from "@prisma/client"

beforeEach(async () => {
    const prisma = new PrismaClient()
    await prisma.user.deleteMany({})
})
...

Но у меня ошибка:

Invalid `prisma.user.deleteMany()` invocation:
The change you are trying to make would violate the required relation 'PostToUser' between the `Post` and `User` models.

Моя база данных

CREATE TABLE User (
  id INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL,
  name VARCHAR(255),
  email VARCHAR(255) UNIQUE NOT NULL,
  password VARCHAR(255) NOT NULL
);

CREATE TABLE Post (
  id INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL,
  title VARCHAR(255) NOT NULL,
  createdAt TIMESTAMP NOT NULL DEFAULT now(),
  content TEXT,
  published BOOLEAN NOT NULL DEFAULT false,
  fk_user_id INTEGER NOT NULL,
  CONSTRAINT `fk_user_id` FOREIGN KEY (fk_user_id) REFERENCES User(id) ON DELETE CASCADE
);

schema.prisma

model Post {
  content    String?
  createdAt  DateTime @default(now())
  fk_user_id Int
  id         Int      @default(autoincrement()) @id
  published  Boolean  @default(false)
  title      String
  author     User     @relation(fields: [fk_user_id], references: [id])

  @@index([fk_user_id], name: "fk_user_id")
}

model User {
  email    String   @unique
  id       Int      @default(autoincrement()) @id
  name     String?
  password String   @default("")
  Post     Post[]
  Profile  Profile?
}

3 ответа

Решение

Вы нарушаете ограничение внешнего ключа между Post а также User. Вы не можете удалитьUser перед удалением его Posts

beforeEach(async () => {
    const prisma = new PrismaClient()
    await prisma.post.deleteMany({where: {...}}) //delete posts first
    await prisma.user.deleteMany({})
})

Или установите удаление КАСКАД для внешнего ключа, таким образом, когда вы удаляете пользователя, его сообщения будут автоматически удаляться

Это еще один способ сделать это, это приведет к удалению всех строк и зависимых от них строк, а также сбросит идентификаторы. Таким образом, вы можете перебирать все таблицы, и порядок не имеет значения.

      prisma.$executeRaw(`TRUNCATE TABLE ${table} RESTART IDENTITY CASCADE;`)

Альтернативное решение:

Я нашел руководство из средней статьи . Но вот код, который я использую на основе этой статьи, единственное отличие состоит в том, что имена таблиц являются динамическими.

Это работает хорошо, если вы правильно настроите каскадное удаление таблиц. В любом случае вы можете использовать тот, который указан в статье, или вместо этого отключить проверку внешнего ключа.

Вы также можете создать отдельную функциюtruncateTableи передайте имя таблицы или модель призмы. Или, может быть, передать массив имен таблиц вrefreshDatabaseвместо.

Другие вопросы по тегам