PostgreSQL avec Prisma ORM
⏱ 60 minPrisma est l'ORM moderne pour Node.js/TypeScript. Il génère un client typé depuis ton schéma, évite les injections SQL et simplifie les migrations.
Initialiser Prisma
npm install @prisma/client
npm install --save-dev prisma
npx prisma init # crée prisma/schema.prisma + .env
Schéma Prisma — définir le modèle de données
// prisma/schema.prisma
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
model User {
id Int @id @default(autoincrement())
email String @unique
name String
xp Int @default(0)
createdAt DateTime @default(now())
lessons CompletedLesson[]
quizzes QuizResult[]
}
model CompletedLesson {
id Int @id @default(autoincrement())
lessonId String
user User @relation(fields: [userId], references: [id])
userId Int
completedAt DateTime @default(now())
@@unique([userId, lessonId])
}
Requêtes Prisma dans Express
const { PrismaClient } = require("@prisma/client");
const prisma = new PrismaClient();
// Créer un utilisateur
const user = await prisma.user.create({
data: { email: "emile@ml.ca", name: "Emile", xp: 0 }
});
// Lire avec relations
const userWithProgress = await prisma.user.findUnique({
where: { id: userId },
include: { lessons: true, quizzes: true }
});
// Mettre à jour l'XP
await prisma.user.update({
where: { id: userId },
data: { xp: { increment: 50 } }
});
Migrations
npx prisma migrate dev --name add-xp-field
npx prisma studio # GUI de la BDD
✍️ Exercices de la leçon
2 exercicesFais-les dans l'ordre, dans un vrai fichier .py — pas dans ta tête. Ne déplie la correction qu'après avoir écrit quelque chose, même faux.
Exercice A — Un schéma Prisma avec relations
Application directe · Tu appliques ce que tu viens de lire.
Modélise une plateforme de cours avec Prisma :
- 1.
User— id, email unique, nom, xp - 2.
Module— id, slug unique, titre - 3.
Lecon— id, titre, appartient à unModule - 4.
LeconTerminee— relie unUserà uneLecon, avec une date, et un utilisateur ne peut terminer une leçon qu'une fois
Puis :
- lance la migration
- écris un script de peuplement (seed) créant 3 utilisateurs et 2 modules avec leurs leçons
- écris une requête qui retourne un utilisateur avec ses leçons terminées et le module de chacune
Exercice B — La page qui fait 201 requêtes SQL
Page blanche · Aucun squelette : à toi de choisir la méthode.
Page blanche. Diagnostic de performance.
Cette page affiche 200 leçons avec le nom de leur module. Elle met 4 secondes à répondre.
const lecons = await prisma.lecon.findMany({ take: 200 });
const affichage = [];
for (const lecon of lecons) {
const module = await prisma.module.findUnique({ where: { id: lecon.moduleId } });
affichage.push({ titre: lecon.titre, module: module.titre });
}
- 1.compte exactement combien de requêtes SQL partent, et explique le nom du problème
- 2.montre comment voir ces requêtes plutôt que de les deviner
- 3.corrige-le
- 4.mesure le gain
- 5.donne deux autres situations où le même problème apparaît sans boucle explicite — c'est là qu'il est vraiment dangereux
Le point 5 est le plus important : la version avec une boucle visible est la forme facile à repérer.