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 prismaInitialiser le projet Prisma :
npx prisma init --datasource-provider sqliteCela 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
Usera plusieursArticle(articles Article[]).Articleappartient à unUserviaauteurId(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 generatemigrate 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
MVC & ORM
Terminez le quiz du chapitre pour le marquer comme complété.
Introduction aux ORM
Qu'est-ce qu'un ORM/ODM, le mapping objet-relationnel, ses avantages et limites, la comparaison avec le SQL brut, et le panorama Prisma, Sequelize, TypeORM et Mongoose.
Exercice — Refactoriser une API en MVC avec un ORM
Refactoriser un gestionnaire d'articles monolithique en séparant la validation (modèle), la logique (service) et le transport HTTP (contrôleur), puis brancher Prisma.