Prisma
Database
Performance
Prisma ORM : Bonnes pratiques en production
Optimisez vos requêtes Prisma, gérez les migrations et évitez les pièges courants en production.
Emmanuel Mulonda15 juillet 202612 min de lecture
Pourquoi Prisma ?
Prisma est devenu l'ORM de référence pour les projets TypeScript. Sa type-safety, ses migrations automatiques et sa documentation le rendent incontournable.
Schema Design
Utilisez des Enums
enum Role {
USER
ADMIN
MODERATOR
}
model User {
id String @id @default(cuid())
email String @unique
role Role @default(USER)
}
Relations Correctement Typées
model Post {
id String @id @default(cuid())
title String
author User @relation(fields: [authorId], references: [id])
authorId String
tags Tag[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@index([authorId])
}
Performance
Utilisez select au lieu de findMany
// ❌ Bad — charge tout
const users = await prisma.user.findMany();
// ✅ Good — ne charge que ce dont on a besoin
const users = await prisma.user.findMany({
select: {
id: true,
name: true,
email: true,
},
});
Pagination avec Cursor
const posts = await prisma.post.findMany({
take: 20,
skip: 1, // Skip the cursor
cursor: { id: lastPostId },
orderBy: { createdAt: "desc" },
});
Transactions
const [user, post] = await prisma.$transaction([
prisma.user.create({ data: { email: "test@example.com" } }),
prisma.post.create({ data: { title: "Mon premier article" } }),
]);
Batch Operations
// Insertion en masse
await prisma.post.createMany({
data: posts.map((p) => ({ title: p.title, content: p.content })),
skipDuplicates: true,
});
Migrations
Workflow Recommandé
# 1. Modifier le schema
# 2. Générer la migration
npx prisma migrate dev --name add_comments_table
# 3. Vérifier le diff
# 4. Appliquer en staging
npx prisma migrate deploy
# 5. Appliquer en production
npx prisma migrate deploy
Seeding
// prisma/seed.ts
import { PrismaClient } from "@prisma/client";
import bcrypt from "bcryptjs";
const prisma = new PrismaClient();
async function main() {
await prisma.user.upsert({
where: { email: "admin@wabtechs.com" },
update: {},
create: {
email: "admin@wabtechs.com",
name: "Admin",
password: await bcrypt.hash("Admin@12345", 12),
role: "ADMIN",
},
});
}
main()
.catch((e) => {
console.error(e);
process.exit(1);
})
.finally(async () => {
await prisma.$disconnect();
});
Pièges Courants
N+1 Queries
Prisma
Database
Performance