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
.
Curso Express - Desenvolvendo aplicações web
Conhecer o cursoCriando 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.
Curso Nest.js - Fundamentos
Conhecer o cursoConclusã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.