Prisma ORM: Primeiros passos 🚀
Iniciando um projeto Node.js utilizando Express.js, com ORM Prisma, TypeScript e Banco de dados relacional Postgresql.
Objetivo deste artigo é entregar uma introdução básica ao ORM Prisma. Não vamos nos aprofundar tanto em todos os métodos que ele nos fornece, mas isso será feito em outro artigo! Uma dica, é importante também ler a documentação que possui um conteúdo detalhado.
Doc: Prisma.io
Requisitos: É preciso instalar o Docker e também ter uma versão do Node.js (12.2 ou maior).
Prisma
Prisma é um ORM de código aberto. Possui um ecossistema de três partes:
Prisma Client: Ele nos permite acessar o banco de dados por meio de métodos e objetos TypeScript/JavaScript simples, sem ter que escrever a consulta na própria linguagem do banco de dados.
Prisma Migrate: Sistema de migração. O Prisma Migrate também armazena todo o nosso histórico de migração e nos permite reverter e reproduzir migrações facilmente.
Prisma Studio: GUI para visualizar e editar dados em sua database. Aqui, podemos realizar operações CRUD (criar, ler, atualizar e excluir) em nossos dados. Esta é a maneira mais fácil de visualizar dados de nosso banco de dados e também de manipulá-los.
E quais são os objetivos do Prisma? Segue abaixo:
Tornar os desenvolvedores de Software mais produtivos ao trabalhar com bancos de dados.
Consultas de banco de dados com segurança de tipo, que podem ser validadas em tempo de compilação.
Pensar em objetos em vez de mapear dados relacionais.
Um dos principais benefícios do Prisma é o nível de abstração que ele fornece, pois evita lidar com consultas SQL ou migrações de esquema complexas.
Preenchimento automático na IDE em vez da necessidade de consultar a documentação.
Legal! E quais os principais serviços SQL e NOSQL que ele nos permite utilizar? Segue na imagem 👇🏼:
E com quais linguagens consigo trabalhar em conjunto com o ORM Prisma? ⬇️
Iniciando
Vamos iniciar um projeto com uma configuração super simples do Prisma, utilizando TypeScript. Primeiro crie uma pasta:
mkdir prisma-projeto
Depois entre na pasta:
cd <my-project>
Agora o comando que todo desenvolvedor que utiliza nodejs conhece:
npm init -y
A seguir, instalaremos nossas dependências de desenvolvimento do Express:
npm install --save express
Configure as dependências de desenvolvimento do Typescript:
//Um comando por vez!
npm install typescript --save-dev
npm install @types/node --save-dev
npm install --save-dev @types/express
O próximo passo é criar o arquivo tsconfig.json, onde definimos as opções do compilador TypeScript. Podemos criar um tsconfig com vários conjuntos de opções, conforme o comando abaixo:
npx tsc --init --rootDir src --outDir build \
--esModuleInterop --resolveJsonModule --lib es6 \
--module commonjs --allowJs true --noImplicitAny true
Certifique-se agora que todos os três arquivos foram criados com sucesso:
Para ajudar no desenvolvimento, vamos adicionar a dependência do nodemon e o ts-node. Estes pacotes vão ajudar a converter nosso TypeScript para JavaScript, sempre que nosso código for atualizado:
npm i ts-node nodemon -D
Adicione esse script ao package.json:
"scripts": {
"dev": "nodemon --watch 'src/' --exec 'ts-node src/app.ts' -e ts",
},
Se está tudo certo podemos continuar criando uma pasta chamada src na raiz do projeto. Dentro desta pasta poderá criar um arquivo chamado app.ts:
Adicione ao arquivo app.ts os imports abaixo:
import express, { Application } from 'express';
const app: Application = express();
const port = process.env.PORT || 3000;
app.use(express.json());
app.listen(port, () => {
console.log(`Listening to requests on port ${port}`);
});
Poderá fazer de outra maneira se já tem conhecimento para isso.
Configurando PostgreSQL e Docker
É importante que nessa etapa já tenha instalado o Docker no seu PC. Vamos criar uma imagem Postgres na raiz do diretório do projeto:
// criar este arquivo na raíz do projeto
postgres.yaml
Depois podemos configurar o arquivo yaml:
version: '3'
services:
postgres:
# Para obter mais detalhes sobre como configurar a imagem Postgres Docker, consulte:
# https://hub.docker.com/_/postgres/
image: postgres:10.3-alpine
# Porta padrão
ports:
- '5432:5432'
network_mode: bridge # port available on localhost
container_name: postgres_docker
environment:
POSTGRES_USER: 'postgres'
POSTGRES_PASSWORD: 'pgpass'
POSTGRES_DB: 'postgres'
volumes:
- ./initdb:/docker-entrypoint-initdb.d
No VSCode é possível baixar uma extensão para o Docker. Agora execute o banco de dados PostgreSQL com Docker, use o seguinte comando:
docker compose -f postgres.yaml up
O comando docker run cria um novo contêiner. Lembre-se de abrir o Docker no seu sistema operacional antes. Ao executar temos sucesso no terminal:
Instalando o Prisma ORM.
Execute o seguinte comando, que instala o Prisma como uma dependência de desenvolvimento:
npm install prisma --save-dev
// ou
yarn add prisma --dev
Depois disso, inicialize o esquema Prisma com o seguinte comando:
npx prisma init
Deve gerar estes arquivos no seu projeto:
Em seguida é importante adicionar a string de conexão do banco de dados ao arquivo env:
DATABASE_URL="DATABASE_URL="postgresql://postgres:pgpass@localhost:5432/users?schema=public"
Adicionando Models
No diretório Prisma, contém o arquivo prisma.schema, nele podemos definir nossas tabelas de banco de dados (models). Vamos começar com a tabela User:
Para converter esses modelos em tabelas no banco de dados PostgreSQL, execute o comando no terminal:
npx prisma migrate dev --name initial
Este comando gera o arquivo de migração, que contém todo o SQL que cria as tabelas no banco de dados PostgreSQL. Sua pasta prisma deve conter agora uma nova pasta migration e também novos arquivos:
Utilizando o Prisma Client
Recomendo que instale em seu VSCode a extensão do ORM:
No seu arquivo app.ts vamos criar um método post. Antes certifique-se de ter instalado o prisma-client:
npm i @prisma/client
// ou
yarn add @prisma/client
Conferido isso podemos prosseguir para o método POST:
import express, { Application } from 'express';
import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();
const app: Application = express();
const port = process.env.PORT || 3000;
app.use(express.json());
app.post(`/signup`, async (req, res) => {
const { nome, email } = req.body;
const result = await prisma.user.create({
data: {
nome: nome,
email: email
},
});
res.json(result);
});
app.listen(port, () => {
console.log(`Listening to requests on port ${port}`);
});
Note que estamos declarando no código acima o import do PrismaClient e criando uma nova instancia dele. Ele automaticamente detecta que tipo de models temos declaradas em nosso schema.prisma. Agora veja a quantidade de opções que o ORM oferece para realizarmos consultas na base:
Se estiver tudo configurado conforme fizemos passo a passo, poderá abrir o Postman ou Insomnia para realizar uma requisição POST para a API. Certifique-se de executar a API com o comando npm run dev.
Primeiro usuário criado com sucesso!
Existe um ORM melhor que o outro?
Um ORM é como qualquer outro pacote de software. Você precisará comparar várias coisas. É importante analisar:
- Recursos para escolher dentro do ORM
- Documentação
- Desempenho
- Suporte da comunidade e dos desenvolvedores do ORM.
Conclusão
Vimos como podemos trabalhar com mais facilidade ao criar base de dados utilizando o Prisma ORM. No próximo artigo vamos conhecer mais sobre as ferramentas que temos a disposição. Muito obrigado por ler e até o próximo artigo! 🚀