Prisma

ORM TypeScript de proxima generacion - consultas type-safe, migraciones, Prisma Studio

TL;DR

Qué: Un ORM de próxima generación para Node.js y TypeScript.

Por qué: Consultas type-safe, cliente auto-generado, navegador visual de base de datos, migraciones.

Quick Start

Instalar:

npm install prisma --save-dev
npm install @prisma/client
npx prisma init

Definir esquema (prisma/schema.prisma):

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

generator client {
  provider = "prisma-client-js"
}

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

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

Ejecutar migraciones:

npx prisma migrate dev --name init

Cheatsheet

ComandoDescripción
npx prisma initInicializar Prisma
npx prisma migrate devCrear migración
npx prisma generateGenerar cliente
npx prisma studioAbrir navegador de BD
npx prisma db pushEnviar esquema (sin migración)
npx prisma db pullExtraer esquema de BD

Gotchas

Operaciones CRUD

import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient()

// Create
const user = await prisma.user.create({
  data: { email: '[email protected]', name: 'John' }
})

// Read
const users = await prisma.user.findMany()
const user = await prisma.user.findUnique({ where: { id: 1 } })

// Update
await prisma.user.update({
  where: { id: 1 },
  data: { name: 'Johnny' }
})

// Delete
await prisma.user.delete({ where: { id: 1 } })

Relaciones

// Create with relation
await prisma.post.create({
  data: {
    title: 'Hello',
    author: { connect: { id: 1 } }
  }
})

// Query with relations
const userWithPosts = await prisma.user.findUnique({
  where: { id: 1 },
  include: { posts: true }
})

Filtrado

const users = await prisma.user.findMany({
  where: {
    email: { contains: '@example.com' },
    name: { not: null },
    posts: { some: { title: { startsWith: 'Hello' } } }
  },
  orderBy: { name: 'asc' },
  take: 10,
  skip: 0
})

Next Steps