Fale com a gente no WhatsApp Fale com a gente no WhatsApp
Fale com a gente no WhatsApp

Node

Trabalhando com Prisma ORM e NestJS

Neste artigo vamos aprender os primeiros passos para trabalhar com o Prisma ORM e o NestJS.

há 1 ano 2 meses

Formação Desenvolvedor Node Full-Stack
Conheça a formação em detalhes

Neste artigo iremos construir uma aplicação básica utilizando outro ORM que está sendo muito utilizado no ecossistema Node.js, o Prisma. Temos artigos utilizando o TypeORM, como em Criando o primeiro CRUD com NestJS e agora vamos abordar essa outra alternativa.

O Prisma é um ORM (Object Relational Mapping), o principal objetivo do ORM é facilitar a interação entre o código da aplicação e os dados armazenados em um banco de dados relacional, eliminando a necessidade de escrever consultas SQL manualmente. Agora vamos ver como usar o Prisma na prática.

Criando projeto de exemplo com NestJS

Para criar um projeto NestJS, basta termos o Node.js instalado, conforme pode ser visto no artigo Instalação do Node.js - Windows, Mac e Linux. Com o Node.js instalado, precisamos instalar o NestCLI, com o seguinte comando:

npm i -g @nestjs/cli

Logo em seguida podemos criar o projeto, que se chamará app-prisma:

nest new app-prisma

Instalando Prisma

Para instalar o Prima via npm, basta executarmos o comando:

npm install prisma --save-dev

Neste momento nós instalamos o Prisma CLI, que será utilizado somente em ambiente de desenvolvimento, ao executarmos a migration conforme os próximos passos deste artigo, o Prisma Client será instalado automaticamente, que é o pacote necessário para trabalhar com o prisma em produção. Você também pode fazer a instalação manual utilizando o seguinte comando:

npm install @prisma/client

O próximo passo é inicializar o prisma utilizando o comando:

npx prisma init

O prisma irá criar um arquivo schema.prisma no diretório /prisma, e o arquivo .env, responsável pelas variáveis de ambiente, onde teremos a variável com a string relacionada a conexão com o banco, os arquivos estarão com o seguinte conteúdo:

// schema.prisma

// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "mysql" // provider = "postgresql"
  url      = env("DATABASE_URL")
}
// .env
# Environment variables declared in this file are automatically made available to Prisma.
# See the documentation for more detail: https://pris.ly/d/prisma-schema#accessing-environment-variables-from-the-schema

# Prisma supports the native connection string format for PostgreSQL, MySQL, SQLite, SQL Server, MongoDB and CockroachDB.
# See the documentation for all the connection string options: https://pris.ly/d/connection-strings

//DATABASE_URL="postgresql://johndoe:randompassword@localhost:5432/mydb?schema=public"
DATABASE_URL="mysql://root:treinaweb@localhost:3306/app-prisma"

Neste caso do exemplo vamos utilizar um banco de dados MySQL, portanto, os dados estão atualizados com o que vamos utilizar no exemplo, as linhas alteradas estão com os valores originais comentados.

Criando primeiro model no Prisma

No arquivo schema.prisma, podemos criar o model, que será o espelho da tabela no banco. Para este exemplo vamos criar um model de usuários, chamado User, onde teremos as seguintes propriedades: id, name, email, description.

// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "mysql"
  url      = env("DATABASE_URL")
}

model User {
  id Int @id @default(autoincrement())
  name String
  email String @unique
  description String 
  
  @@map("users")
}

Veja que utilizamos a palavra reservada model para criar este modelo, desta forma passando as propriedades e seus respectivos tipos e particularidades, também utilizamos o recurso map, para criar a tabela no banco com o nome users.

Express - Desenvolvendo aplicações web
Curso Express - Desenvolvendo aplicações web
Conhecer o curso

Criando migration no Prisma

Para criar a primeira migration, basta utilizarmos o comando:

npx prisma migrate dev --name users

Neste caso criamos a migration relacionada a tabela users, ao executar o comando acima, o prisma cria um novo diretório /prisma/migrations/[timestamp_nome-da-migration], e neste diretório é gerado um arquivo .sql com a query respectiva a criação da tabela correspondente ao model.

// prisma/migrations/20230922182027_users

-- CreateTable
CREATE TABLE `users` (
    `id` INTEGER NOT NULL AUTO_INCREMENT,
    `name` VARCHAR(191) NOT NULL,
    `email` VARCHAR(191) NOT NULL,
    `description` VARCHAR(191) NOT NULL,

    UNIQUE INDEX `users_email_key`(`email`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Vale reforçar que o prisma além de criar a migration também executa a query, portanto, o banco de dados já possui a tabela users, vazia, e também uma tabela _prisma_migrations, onde ficará o histórico dos dados referentes as migrations executadas.

Pra finalizar a configuração do prisma, precisamos também criar o arquivo prisma.service.ts, ele será criado dentro do diretório src

//prisma.service.ts
import { INestApplication, Injectable, OnModuleInit } from '@nestjs/common';
import { PrismaClient } from '@prisma/client';

@Injectable()
export class PrismaService extends PrismaClient implements OnModuleInit {
  async onModuleInit() {
    await this.$connect();
  }

  async enableShutdownHooks(app: INestApplication) {
    process.on('beforeExit', async () => {
      await app.close();
    });
  }
}

Este arquivo é responsável por gerenciar a conexão com banco de dados.

Perfeito, o prisma está conectado e interagindo com o banco de dados da forma correta, agora precisamos criar a estrutura para permitir as operações com o banco e a aplicação.

Criando recurso para adicionar usuários

Agora vamos criar a estrutura para a aplicação adicionar um usuário, para isto vamos executar o comando:

nest g res user --no-spec

Desta forma o NestCLI irá gerar a estrutura com os arquivos relacionados ao controller, module e service. Vale salientar que estamos utilizando o padrão REST API para este exemplo.

O próximo passo é criar o método create(), tanto no controller, para receber os dados na requisição, quanto no service, para efetuar efetivamente o registro no banco de dados, como podemos ver abaixo:

//user.controller.ts
import { Body, Controller, Post } from '@nestjs/common';
import { UserService } from './user.service';
import { Prisma } from '@prisma/client';

@Controller('user')
export class UserController {
  constructor(private readonly userService: UserService) {}

  @Post()
  create(@Body() user: Prisma.UserCreateInput) {
    return this.userService.create(user);
  }
}

Veja que o prisma provê o tipo UserCreateInput, que podemos utilizar para receber os dados na requisição e criar um novo registro. Lembrando que você também pode utilizar a técnica do DTO, sendo uma boa prática em relação a deixar a aplicação menos dependente do ORM.

//user.service.ts
import { Injectable } from '@nestjs/common';
import { Prisma } from '@prisma/client';
import { PrismaService } from 'src/prisma.servce';

@Injectable()
export class UserService {
  constructor(private prisma: PrismaService) {}
  create(user: Prisma.UserCreateInput) {
    return this.prisma.user.create({ data: user });
  }
}

Já no user.service.ts, veja que importamos o PrismaService e utilizamos a técnica de injeção de dependências. Então, podemos ter acesso aos recursos do prisma, como salvar um novo registro utilizando o método create() referente ao model do registro que será salvo, passando como parâmetro um objeto com as propriedades do respectivo model.

Testando cadastro de usuário

Finalmente podemos testar o cadastro de um novo registro utilizando o Prisma, vamos efetuar a requisição na rota POST http://localhost:3000/user, com os seguintes dados:

{
	"name":"Wesley",
	"email":"wesleygado@gmail.com",
	"description":"Teacher"
}

Se tudo ocorrer da maneira correta vamos obter de retorno um objeto respectivo ao registro salvo no banco:

{
	"id": 1,
	"name": "Wesley",
	"email": "wesleygado@gmail.com",
	"description": "Teacher"
}

Perfeito, a aplicação está se comportando da forma esperada.

Nest.js - Fundamentos
Curso Nest.js - Fundamentos
Conhecer o curso

Conclusão

Neste artigo aprendemos a efetuar a instalação e integração do Prisma ORM com o NestJS, combinação essa que vem ganhando espaço no ecossistema JavaScript, e ainda efetuamos a implementação da rota POST referente ao cadastro de um registro em um banco de dados MySQL. O Prisma possibilita integração com o TypeScript, sistema simplificado de migrations, facilidade de uso, entre outras vantagens que valem o seu tempo para aprender essa tecnologia.

Por fim, caso queira aprender mais sobre NestJS saiba que aqui na TreinaWeb temos o curso Nest.js - Fundamentos que possui 02h07 de vídeos e um total de 18 exercícios. Conheça também nossos outros cursos de TypeScript.

Veja quais são os tópicos abordados durante o curso de Nest.js - Fundamentos:

  • Conhecendo a estrutura;
  • Utilizando Nest CLI
  • Entendendo Rotas, Controllers e Views;;
  • Conexão com banco de dados;
  • Usando TypeORM;
  • Template Engine.

Autor(a) do artigo

Wesley Gado
Wesley Gado

Formado em Análise e Desenvolvimento de Sistemas pelo Instituto Federal de São Paulo, atuou em projetos como desenvolvedor Front-End. Nas horas vagas grava Podcast e arrisca uns três acordes no violão.

Todos os artigos

Artigos relacionados Ver todos