TW3 — Technologies du Web 3

Prisma en pratique

Installation de Prisma, schéma, modèles et relations, migrations, client généré, CRUD typé et intégration dans un contrôleur Express.

Prisma est un ORM moderne pour Node.js et TypeScript. On décrit le schéma une fois, et Prisma génère un client typé plus les migrations de base.

📦 Installation

npm install @prisma/client
npm install -D prisma

Initialiser le projet Prisma :

npx prisma init --datasource-provider sqlite

Cela crée prisma/schema.prisma et un fichier .env avec l'URL de connexion.

📝 Le schéma

Le schéma décrit les modèles (tables) et leurs relations.

// prisma/schema.prisma
model Article {
  id        Int      @id @default(autoincrement())
  titre     String
  prix      Float    @default(0)
  publieLe  DateTime @default(now())
  auteur    User     @relation(fields: [auteurId], references: [id])
  auteurId  Int
}

model User {
  id      Int      @id @default(autoincrement())
  email   String   @unique
  articles Article[]
}

🔑 Relations

  • User a plusieurs Article (articles Article[]).
  • Article appartient à un User via auteurId (clé étrangère).
  • Prisma génère les requêtes de jointure pour vous.

🚀 Migrations

Une migration crée/évolue la structure de la base en suivant le schéma.

npx prisma migrate dev --name init
npx prisma generate

migrate dev applique le changement et crée un fichier de migration versionné. generate (ré)crée le client typé.

⚡ Le client généré et le CRUD typé

On importe le client et on l'utilise partout, avec un typage complet.

// lib/prisma.ts
import { PrismaClient } from "@prisma/client"
export const prisma = new PrismaClient()
// Création
const article = await prisma.article.create({
  data: { titre: "Hello", prix: 9.9, auteurId: 1 },
})

// Lecture
const tous = await prisma.article.findMany({ include: { auteur: true } })

// Mise à jour
await prisma.article.update({
  where: { id: 1 },
  data: { prix: 12.0 },
})

// Suppression
await prisma.article.delete({ where: { id: 1 } })

Comme article est typé, l'autocomplétion vous proposera titre, prix, auteur — et signalera une faute de frappe immédiatement.

🔌 Intégration dans un contrôleur Express

Le modèle devient une fine couche autour de Prisma ; le contrôleur reste concentré sur le HTTP.

// models/article.ts
import { prisma } from "../lib/prisma.js"

export const Article = {
  validate(data: { titre?: unknown; prix?: unknown }) {
    const errors: string[] = []
    if (typeof data.titre !== "string") errors.push("titre requis")
    if (typeof data.prix !== "number" || data.prix < 0) errors.push("prix invalide")
    return errors
  },
  create(data: { titre: string; prix: number; auteurId: number }) {
    return prisma.article.create({ data })
  },
  findAll() {
    return prisma.article.findMany()
  },
}
// controllers/articleController.ts
import type { Request, Response } from "express"
import { Article } from "../models/article.js"

export async function createArticle(req: Request, res: Response) {
  const errors = Article.validate(req.body)
  if (errors.length) return res.status(400).json({ errors })
  const article = await Article.create(req.body)
  res.status(201).json(article)
}

➡️ Exercice

Appliquez tout cela dans l'exercice MVC + ORM.

Quiz du chapitre

5 questions
0 / 5 répondue0%
  1. 1Quelle commande Prisma crée et applique une migration en développement ?
  2. 2Que fait 'npx prisma generate' ?
  3. 3Comment déclare-t-on une relation 'un User a plusieurs Articles' ?
  4. 4Que retourne prisma.article.create({ data }) ?
  5. 5Pourquoi placer Prisma dans une couche modèle plutôt que dans le contrôleur ?
Répondez à toutes les questions pour valider.

MVC & ORM

Terminez le quiz du chapitre pour le marquer comme complété.

Tableau de bord

On this page