Prisma: Criando e Executando um Seed
Ao desenvolver uma aplicação, especialmente durante a fase de desenvolvimento e testes, é essencial ter um banco de dados pré-populado com dados iniciais. Isso facilita a criação, teste e validação das funcionalidades da aplicação sem a necessidade de inserir dados manualmente toda vez. Neste artigo, vamos explorar como criar e executar um seed para pré-popular um banco de dados usando Prisma.
O que é um Seed?
Um seed é um script que insere dados predefinidos no banco de dados. Esses dados iniciais são úteis para desenvolvedores, pois permitem testar funcionalidades da API e garantir que não estão trabalhando com um banco de dados vazio. Com dados iniciais, é possível simular cenários reais de uso e verificar o comportamento da aplicação de forma mais eficaz.
Passo a Passo para Criar e Executar um Seed com Prisma
1. Criar o Arquivo de Seed
Primeiramente, crie um arquivo
seed.ts
dentro do diretório prisma
(ou em qualquer outro local de sua preferência). Este arquivo conterá a lógica necessária para inserir dados no banco de dados.2. Estrutura Básica do Seed
No arquivo
seed.ts
, configure uma função que será responsável por inserir os dados iniciais e garantir que a conexão com o banco de dados seja encerrada corretamente após a execução.import { PrismaClient } from '@prisma/client'; const prisma = new PrismaClient(); async function seed() { // Código para inserir dados iniciais console.log('Database seeded'); await prisma.$disconnect(); } seed().catch(e => { console.error(e); prisma.$disconnect(); process.exit(1); });
3. Inserindo Dados Iniciais
Dentro da função
seed
, utilize o Prisma para criar registros no banco de dados. Aqui está um exemplo de como criar um evento:async function seed() { await prisma.event.create({ data: { id: 'unique-id-12345', // ID fixo para o evento title: 'Unite Summit', slug: 'unite-summit', details: 'Evento para apaixonados por código', maximumAttendees: 120 } }); console.log('Database seeded'); await prisma.$disconnect(); }
Usar um ID fixo garante que o evento criado sempre terá o mesmo ID, facilitando a referência a esse evento em outras partes da aplicação.
4. Configurar Cascade Delete (Opcional)
Se o seu modelo de dados possui relacionamentos, é importante configurar cascading deletes para evitar erros ao deletar registros relacionados. No arquivo
schema.prisma
, configure as relações para que os registros filhos sejam deletados automaticamente quando o registro pai for deletado.model Event { id String @id @default(uuid()) title String slug String details String maximumAttendees Int participants Participant[] @relation("EventParticipants", onDelete: Cascade) } model Participant { id String @id @default(uuid()) eventId String event Event @relation(fields: [eventId], references: [id], onDelete: Cascade) }
Após ajustar o modelo, execute uma migração para aplicar as mudanças:
npx prisma migrate dev --name add-cascades
5. Adicionar Script de Seed no package.json
Para facilitar a execução do seed, adicione um comando de seed no arquivo
package.json
:"prisma": { "seed": "tsx prisma/seed.ts" }
6. Executar o Seed
Execute o seed usando o comando:
npx prisma db seed
No terminal, você verá as queries executadas e uma mensagem confirmando que o banco de dados foi seeded com sucesso.
7. Verificar os Dados
Para verificar se os dados foram inseridos corretamente, você pode usar o Prisma Studio:
npx prisma studio
Isso abrirá uma interface gráfica onde você poderá visualizar os registros no banco de dados.
Utilizar seeds é uma prática recomendada para garantir que seu ambiente de desenvolvimento tenha dados consistentes para teste. A configuração de cascading deletes deve ser usada com cuidado, considerando o impacto na performance e nas regras de negócio do seu sistema. A seguir, temos o exemplo completo do arquivo
seed.ts
e do modelo schema.prisma
com as configurações necessárias.Exemplo Completo do Arquivo seed.ts:
import { PrismaClient } from '@prisma/client'; const prisma = new PrismaClient(); async function seed() { await prisma.event.create({ data: { id: 'unique-id-12345', title: 'Unite Summit', slug: 'unite-summit', details: 'Evento para apaixonados por código', maximumAttendees: 120 } }); console.log('Database seeded'); await prisma.$disconnect(); } seed().catch(e => { console.error(e); prisma.$disconnect(); process.exit(1); });
Exemplo Completo do Arquivo schema.prisma com Cascading Deletes:
model Event { id String @id @default(uuid()) title String slug String details String maximumAttendees Int participants Participant[] @relation("EventParticipants", onDelete: Cascade) } model Participant { id String @id @default(uuid()) eventId String event Event @relation(fields: [eventId], references: [id], onDelete: Cascade) }
Comando para Executar o Seed:
npx prisma db seed
Essa abordagem garante que você tenha um banco de dados inicializado com dados úteis para desenvolvimento e testes, melhorando a eficiência do processo de desenvolvimento.