Prisma

ORM TypeScript nouvelle generation - requetes type-safe, migrations, Prisma Studio

TL;DR

Quoi : Un ORM nouvelle génération pour Node.js et TypeScript.

Pourquoi : Requêtes type-safe, client auto-généré, navigateur de base de données visuel, migrations.

Quick Start

Installer :

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

Définir le schéma (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
}

Exécuter les migrations :

npx prisma migrate dev --name init

Cheatsheet

CommandeDescription
npx prisma initInitialiser Prisma
npx prisma migrate devCréer une migration
npx prisma generateGénérer le client
npx prisma studioOuvrir le navigateur de BDD
npx prisma db pushPousser le schéma (sans migration)
npx prisma db pullTirer le schéma de la BDD

Gotchas

Opérations 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 } })

Relations

// 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 }
})

Filtrage

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