#
Como usar Prisma ORM ?
#
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.
Autenticação por biblioteca
Atenção que ao usar autenticação por biblioteca pode ser necessário conformar as tabelas do banco de dados à biblioteca!! Por exemplo, o Next Auth requer 3 models com certos atributos para que funcione corretamente.
#
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
push ou migrate?
O Prisma também permite gerar migrações em sql (útil em ambiente de produção). Em ambiente de desenvolvimento, usar db push
para forçar a mudança no banco de dados facilita nossa vida.
As migrações em sql dão maior liberdade para escrever scripts na migraçã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
- Criar um arquivo TypeScript
touch create.ts
- 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);
});
- Executar arquivo typescript
pnpm ts-node create.ts
bunx ts-node create.ts
npx ts-node create.ts
Não
#
Read (Index)
- Criar um arquivo TypeScript
touch index.ts
- 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);
});
- Executar arquivo typescript
pnpm ts-node index.ts
bunx ts-node index.ts
npx ts-node index.ts
Não
#
Read (Show)
- Criar um arquivo TypeScript
touch show.ts
- 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);
});
- Executar arquivo typescript
pnpm ts-node show.ts
bunx ts-node show.ts
npx ts-node show.ts
Não
#
Update
- Criar um arquivo TypeScript
touch update.ts
- 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);
})
- Executar arquivo typescript
pnpm ts-node update.ts
bunx ts-node update.ts
npx ts-node update.ts
Não
#
Delete
- Criar um arquivo TypeScript
touch delete.ts
- 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);
});
- Executar arquivo typescript
pnpm ts-node delete.ts
bunx ts-node delete.ts
npx ts-node delete.ts
Não
#
Mais sobre
#
Criando uma seed
Vendo as operações de CRUD, é meio claro que para criarmos uma seed, basta usarmos a ideia do
- 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();
});
- 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
- Adicione um script ao
package.json
que facilitará rodar a seed:
{
"scripts": {
...outros scripts,
"db:seed": "ts-node prisma/seed.ts"
}
}
Caso você esteja num repositório Next, ou outro repositório onde não possa colocar o { "type": "module" }
no package.json
, deixe o script da seguinte maneira:
{
"scripts": {
"db:seed": "ts-node --compiler-options {\\\"module\\\":\\\"CommonJS\\\"} 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