Удалите все элементы в таблице с помощью 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
вместо.