Configuration de Prisma pour un e-commerce React Router 7

Découvre comment installer, configurer Prisma et modéliser ta base pour un projet e-commerce React Router. Boost ton projet avec un schéma clair et un seed rapide.

5 min read
Déverrouillez votre potentiel

avec React Router 7

Vous en avez marre de...

❌ perdre du temps à chercher des informations éparpillées
❌ ne pas avoir de retour sur votre progression
Assistant IA spécialisé

Posez vos questions 24/7 à notre IA experte en React Router 7

Quiz interactifs

Validez vos acquis avec des quiz personnalisés et un feedback instantané

9 modules
72 leçons
Accès à vie
299.49
-35%

Pourquoi utiliser Prisma pour notre boutique ?

Le modèle e-commerce que nous allons bâtir est loin du simple « todo ». On aura des produits, des catégories, un panier, des commandes, des factures Stripe... bref : beaucoup de relations. Prisma nous offre :

  1. un schéma déclaratif lisible (et versionné) ;
  2. un client TypeScript auto-généré avec autocomplétion solide ;
  3. un service PostgreSQL serverless gratuit (500 Mo + 100 000 req/mois) parfait pour le dev.

Dans cette leçon on va :

  1. installer Prisma et la base serverless fournie par Prisma Cloud ;
  2. modéliser la première version de notre schéma e-commerce ;
  3. créer la migration, le client et un script seed.ts pour remplir 10 produits ;
  4. corriger les petits pièges vus dans la vidéo (Decimal, import du client, Query Compiler).

Installer Prisma + base PostgreSQL en 1 commande

install.sh
1
npx prisma@latest init --db
  1. Le CLI te demande d’ouvrir un lien ; connecte-toi avec GitHub.
  2. Choisis la région eu-west-par (Paris) – latence minimale pour tes visiteurs français.
  3. Nom du projet : shop-router.

Le CLI ajoute deux fichiers :

1
prisma/schema.prisma # schéma vide
2
.env # DATABASE_URL=https://…cloud.prisma.sh

La Database_URL pointe déjà vers ta base cloud PostgreSQL – pas de Docker local à configurer !


Installer les dépendances runtime & dev

install.sh
1
npm install prisma @prisma/client @prisma/extension-accelerate
  • prisma : CLI + générateur ;
  • @prisma/client : ORM typé côté serveur ;
  • @prisma/extension-accelerate : couche cache ✅.

Déclarer le client singleton

app/server/db.server.ts
1
import { PrismaClient } from "@prisma/client";
2
import { acceleratePrisma } from "@prisma/extension-accelerate";
3
4
declare global {
5
var prisma: ReturnType<typeof getPrisma> | undefined;
6
}
7
8
function getPrisma() {
9
return new PrismaClient().$extends(acceleratePrisma());
10
}
11
12
export const prisma = globalThis.prisma ??= getPrisma();
  • Singleton ➜ HMR ne crée qu’une connexion.
  • Extension Accelerate ➜ cache partagé (tu pourras l’activer route par route plus tard).

Concevoir le schéma e-commerce

Plutôt que tout taper à la main on part du prompt résumé ci-dessous ; copie-le dans ChatGPT/Cursor :

1
// E-commerce SaaS (non multi-tenant)
2
// User, Category, Product (+images), Cart, Order, Invoice, EmailLog
3
// Stripe product & price ids, guest checkout, stock management…

L’IA génère un brouillon Prisma que tu colles dans prisma/schema.prisma, puis relis chaque modèle :

Extraits clés

prisma/schema.prisma
1
model Product {
2
id String @id @default(uuid())
3
name String
4
slug String @unique
5
description String?
6
currency String @default("EUR")
7
price Decimal @db.Decimal(10, 2) // ^? centimes ? voir ci-dessous
8
stock Int @default(0)
9
isActive Boolean @default(true)
10
stripeProductId String? @unique
11
stripePriceId String? @unique
12
images Image[]
13
categories Category[]
14
CartItem CartItem[]
15
createdAt DateTime @default(now())
16
updatedAt DateTime @updatedAt
17
}

Générer la migration et le client

Terminal
1
npx prisma migrate dev --name init-shop-router
  • Prisma pousse le SQL dans ta base cloud.
  • Le client TypeScript est généré dans generated/prisma (grâce à l’option output).
{4-6}
1
generator client {
2
provider = "prisma-client"
3
output = "../generated/prisma"
4
previewFeatures = ["queryCompiler", "relationJoins", "driverAdapters"]
5
moduleFormat = "esm"
6
}

Regénère :

Terminal
1
npx prisma generate

Script de seed : 3 catégories, 10 produits aléatoires

prisma/seed.ts
1
import { prisma } from "~/server/db.server";
2
3
const slug = (s: string) =>
4
s.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/(^-|-$)/g, "");
5
6
async function main() {
7
await prisma.product.deleteMany();
8
await prisma.category.deleteMany();
9
10
const cats = await prisma.$transaction(
11
["Vêtements", "Accessoires", "Maison"].map((n) =>
12
prisma.category.create({ data: { name: n, slug: slug(n) } }),
13
),
14
);
15
16
for (let i = 0; i < 10; i++) {
17
const name = `Produit ${i + 1}`;
18
await prisma.product.create({
19
data: {
20
name,
21
slug: `${slug(name)}-${i}`,
22
description: `Description de ${name}`,
23
price: (Math.random() * 150 + 5).toFixed(2),
24
stock: Math.floor(Math.random() * 100),
25
categories: { connect: { id: cats[i % cats.length].id } },
26
},
27
});
28
}
29
}
30
31
main().finally(() => prisma.$disconnect());

Exécution :

Terminal
1
npm run dev # lance l'app dans un 1er terminal
2
npx tsx prisma/seed.ts

Prisma Studio (npx prisma studio) montre tes 10 produits et 3 catégories.


Afficher les produits côté Home

app/routes/home.tsx
1
import { prisma } from "~/server/db.server";
2
import { useLoaderData } from "react-router";
3
4
export async function loader() {
5
return prisma.product.findMany({
6
select: { id: true, name: true, description: true, price: true },
7
});
8
}
9
10
export default function Home() {
11
const products = useLoaderData<typeof loader>();
12
return (
13
<main className="grid gap-6 p-8 md:grid-cols-2 lg:grid-cols-3">
14
{products.map((p) => (
15
<article key={p.id} className="rounded-lg border p-4 shadow">
16
<h2 className="text-lg font-semibold">{p.name}</h2>
17
<p className="text-sm opacity-70">{p.description}</p>
18
<p className="mt-2 text-right text-sky-600 font-bold">
19
{Number(p.price).toFixed(2)}
20
</p>
21
</article>
22
))}
23
</main>
24
);
25
}

L’écran d’accueil affiche désormais 10 cartes produits — le back-end est prêt !


Pièges & correctifs vus dans la vidéo

ProblèmeSolution
export is not defined au runtimeAjoute queryCompiler + moduleFormat = "esm" dans le générateur.
Import ancien chemin .prisma/clientUtilise toujours @prisma/client généré dans generated/prisma.
Decimal affiché [Object object]Convertis via Number(p.price) ou p.price.toFixed(2) côté UI.

Ce que tu dois committer

1
git checkout -b 7-2-configuration-de-prisma
2
git add .
3
git commit -m "feat: configure Prisma + schema e-commerce + seed"
4
git push -u origin 7-2-configuration-de-prisma

Pull-request, merge, et ta base est officiellement dans le dépôt. 🚀


Premium
Quiz interactif
Testez vos connaissances et validez votre compréhension du module avec notre quiz interactif.
1

Comprendre les concepts fondamentaux

Quelle est la principale différence entre les composants client et serveur dans React ?

Les composants client s'exécutent uniquement dans le navigateur
Les composants serveur peuvent utiliser useState
Les composants client sont plus rapides
Il n'y a aucune différence significative
2

Optimisation des performances

Quelle technique est recommandée pour éviter les rendus inutiles dans React ?

Utiliser React.memo pour les composants fonctionnels
Ajouter plus d'états locaux
Éviter d'utiliser les props
Toujours utiliser les class components
3

Architecture des données

Quel hook permet de gérer les effets de bord dans un composant React ?

useEffect
useState
useMemo
useContext
4

Gestion des erreurs

Comment implémenter la gestion des erreurs pour les requêtes API dans React ?

Utiliser try/catch avec async/await
Ignorer les erreurs
Toujours afficher un message d'erreur
Rediriger l'utilisateur
5

Déploiement et CI/CD

Quelle est la meilleure pratique pour déployer une application React en production ?

Utiliser un service CI/CD comme GitHub Actions
Copier les fichiers manuellement via FTP
Envoyer le code source complet
Ne jamais mettre à jour l'application

Débloquez ce quiz et tous les autres contenus premium en achetant ce cours