# Como usar Prisma ORM ?

Por
Padovesi
Em 
Publicado 2023-10-19

# Criando Models (Prisma CLI)

O Prisma tem sua própria sintaxe para declarar o schema no banco de dados.

// prisma/schema.prisma

generator client {
  provider = "prisma-client-js"
  output   = "./generated/client"
}

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

model User {
  id       Int      @id @default(autoincrement())
  username String
  email    String   @unique
  posts    Post[]
}

model Post {
  id        Int      @id @default(autoincrement())
  title     String
  content   String
  published Boolean  @default(false)
  authorId  Int
  author    User     @relation(fields: [authorId], references: [id])
}

É interessante notar que o prisma.schema possui 3 partes:

  • generator: declara quais assets (artefatos/arquivos) são criados ao rodar o comando generate do prisma.
  • datasource: Declare qual o SGBD (Sistema de Gerenciamento de Banco de Dados) utilizado, e a url de conexão ao banco de dados do projeto.
  • models: Isso é a modelagem de fato do banco de dados, que vai para o schema do banco de dados do projeto;

Veja mais na documentação deles.

# Efetivando as alterações no prisma.schema

É possível gerar migrações em .sql - ou seja, arquivos escritos em código sql, que contém as alterações realizadas no schema.prisma (desde a última migração) e que devem ser realizadas no schema do seu banco de dados -, ou simplesmente forçar o schema do banco de dados a atualizar. Em desenvolvimento, o recomendado é forçar a atualização, e simplesmente rodar o seguinte comando:

pnpm prisma db push
bunx prisma db push
npx prisma db push

Não

# Mais sobre

Documentação Criação de Models

Documentação Relacionamento entre Models

# CRUD

CRUD é uma acrônimo para as quatro maneiras básicas de se operar com informações armazenadas em uma aplicação. Estas operações são: Create, Read, Update e Delete.

Então, a seguir seguem formas de construirmos um CRUD utiilizando o Prisma, para interação com as instâncias do nosso banco de dados.

Verifique que já criou uma instância do prisma client.

Neste exemplo, estamos rodando os arquivos com ts-node, que transpila o TypeScript e roda o JavaScript resultante com Node. A ideia é a mesma usando api em Express, NextJS, etc.

# Create

  1. Criar um arquivo TypeScript
touch create.ts
  1. Modificar o arquivo typescript
// create.ts

import { prisma } from "./prisma";

async function createUser(username, email) {
  const user = await prisma.user.create({
    data: {
      username,
      email,
      // ...
    },
  });
  return user;
}

createUser("john_doe", "john@example.com").then((user) => {
  console.log("Usuário criado:", user);
});
  1. Executar arquivo typescript
pnpm ts-node create.ts
bunx ts-node create.ts
npx ts-node create.ts

Não

# Read (Index)

  1. Criar um arquivo TypeScript
touch index.ts
  1. Modificar o arquivo typescript
// index.ts

import { prisma } from "./prisma";

async function getAllUsers() {
  const users = await prisma.user.findMany();
  return users;
}

getAllUsers().then((users) => {
  console.log("Usuários encontrados:", users);
});
  1. Executar arquivo typescript
pnpm ts-node index.ts
bunx ts-node index.ts
npx ts-node index.ts

Não

# Read (Show)

  1. Criar um arquivo TypeScript
touch show.ts
  1. Modificar o arquivo typescript
// show.ts

import { prisma } from "./prisma";

async function getUserById(userId) {
  const user = await prisma.user.findUnique({
    where: {
      id: userId,
    },
  });
  return user;
}

getUserById(1).then((user) => {
  console.log("Usuário encontrado:", user);
});
  1. Executar arquivo typescript
pnpm ts-node show.ts
bunx ts-node show.ts
npx ts-node show.ts

Não

# Update

  1. Criar um arquivo TypeScript
touch update.ts
  1. Modificar o arquivo typescript
import { prisma } from './prisma';

async function updateUser(userId, newData) {
  const user = await prisma.user.update({
    where: {
      id: userId,
    },
    data: {
      data: newData
    },
  });
  return user;
}

updateUser(1, {'new_email@example.com'})
  .then((user) => {
    console.log('Usuário atualizado:', user);
  })
  1. Executar arquivo typescript
pnpm ts-node update.ts
bunx ts-node update.ts
npx ts-node update.ts

Não

# Delete

  1. Criar um arquivo TypeScript
touch delete.ts
  1. Modificar o arquivo typescript
// delete.ts

import { prisma } from "./prisma";

async function deleteUser(userId) {
  const user = await prisma.user.delete({
    where: {
      id: userId,
    },
  });
  return user;
}

deleteUser(1).then((user) => {
  console.log("Usuário excluído:", user);
});
  1. Executar arquivo typescript
pnpm ts-node delete.ts
bunx ts-node delete.ts
npx ts-node delete.ts

Não

# Mais sobre

Documentação CRUD do Prisma

# Criando uma seed

Vendo as operações de CRUD, é meio claro que para criarmos uma seed, basta usarmos a ideia do create.

  1. Crie o arquivo seed.ts;
touch prisma/seed.ts
// prisma/seed.ts

import { prisma } from "./prisma";

async function seed() {
  await prisma.user.create({
    data: {
      username,
      email,
      // ...
    },
  });

  await prisma.blogPost.create({
    data: {
      title: "TITO",
      body: "opa eae",
    },
  });
}

seed()
  .then(() => {
    console.log("Seed realizada com sucesso");
  })
  .catch((err) => {
    console.error(err.message);
  })
  .finally(() => {
    prisma.$disconnect();
  });
  1. Caso não já esteja no projeto, adicione o pacote ts-node;
pnpm add ts-node
bun add ts-node
npm install ts-node

Não

  1. Adicione um script ao package.json que facilitará rodar a seed:
{
  "scripts": {
    ...outros scripts,
    "db:seed": "ts-node prisma/seed.ts"
  }
}

Agora, para rodar a seed do projeto basta usar o comando:

pnpm db:seed
bun run db:seed
npm run db:seed

Não

# Mais detalhes (Referência da API)

Referência da API