Prisma ORM: Primeiros passos 🚀

Iniciando um projeto Node.js utilizando Express.js, com ORM Prisma, TypeScript e Banco de dados relacional Postgresql.

Prisma ORM: Primeiros passos 🚀

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 👇🏼:

Captura de Tela 2022-01-05 às 23.42.59.png

E com quais linguagens consigo trabalhar em conjunto com o ORM Prisma? ⬇️

Captura de Tela 2022-01-05 às 23.50.23.png

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:

Captura de Tela 2022-01-06 às 00.20.44.png

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:

Captura de Tela 2022-01-06 às 13.25.20.png

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:

Captura de Tela 2022-01-06 às 09.17.09.png

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:

Captura de Tela 2022-01-06 às 10.02.20.png

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:

11.png 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:

Captura de Tela 2022-01-06 às 13.26.59.png

Utilizando o Prisma Client

Recomendo que instale em seu VSCode a extensão do ORM:

Captura de Tela 2022-01-06 às 16.06.12.png

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:

Gravação de Tela 2022-01-06 às 15.44.18.gif

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.

Captura de Tela 2022-01-06 às 14.15.40.png

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! 🚀