Apprends à installer, initialiser et utiliser Prisma pour gérer ta base PostgreSQL dans React Router 7. Passe à l’étape full-stack avec un client TypeScript typé.
avec React Router 7
Posez vos questions 24/7 à notre IA experte en React Router 7
Validez vos acquis avec des quiz personnalisés et un feedback instantané
Ton app React Router 7 est full-stack : le serveur Express rend les pages, exécute les loader
/action
… et, très vite, a besoin de lire/écrire dans une base.
Prisma est l’ORM qui colle parfaitement à cette philosophie :
Tu vas voir comment l’ajouter pas-à-pas à la base de code construite dans les modules précédents.
1npm install -D prisma2npm install -D @prisma/client tsx
@prisma/client
sera utilisé runtime côté serveur.tsx
exécute les scripts TypeScript (seed, migrations) sans transpile.1npx prisma init
Prisma crée :
1prisma/2├── schema.prisma # ton schéma de données3└── .env # la chaîne de connexion DATABASE_URL
Dans schema.prisma
définis ton premier modèle :
1model User {2id Int @id @default(autoincrement())3firstName String4lastName String5slug String @unique6age Int7active Boolean @default(true)8}
Lance ta 1ère migration :
1npx prisma migrate dev --name init
Prisma écrit le SQL, crée la table User
, puis génère le client.
Dans .env
renseigne la connexion :
1DATABASE_URL="postgresql://postgres@localhost:5432/react_router_7"
Deux options :
--db=postgresql
dans prisma create
) : base managée, sauvegardes incluses ; payant au-delà du free tier.Le transcript montre les deux chemins, choisis celui adapté à ton projet.
Les docs suggèrent ceci :
1generator client {2provider = "prisma-client-js"3output = "../app/generated/prisma" // ⚠️ bug avec React Router 74}
Pour éviter le bug de résolution vu dans la vidéo, commente la ligne
output
et garde la génération par défaut :
1- output = "../app/generated/prisma"
Puis regénère :
1npx prisma generate
1import { prisma } from "~/server/db.server";23const users = [4{ firstName: "Virgile", lastName: "Rietsch", slug: "virgile", age: 28 },5{ firstName: "Robert", lastName: "Durand", slug: "robert", age: 35 },6{ firstName: "John", lastName: "Doe", slug: "john", age: 42 },7];89await prisma.user.deleteMany(); // reset10for (const u of users) {11await prisma.user.create({ data: u });12}
Ajoute le script dans package.json
:
1{ "prisma": { "seed": "tsx prisma/seed.ts" } }
Exécute :
1npx prisma db seed
Visualise dans Prisma Studio :
1npx prisma studio
Réduis les connexions en créant un singleton :
1import { PrismaClient } from "@prisma/client";23declare global {4var prismaClient: PrismaClient | undefined;5}67globalThis.prismaClient ??= new PrismaClient();8export const prisma = globalThis.prismaClient;
Chaque loader/action importe simplement :
1import { prisma } from "~/server/db.server";
1export async function getUsers() {2return prisma.user.findMany();3}45export async function addUser(data: UserCreateInput) {6const slug = createSlug(data.firstName);7await prisma.user.create({ data: { ...data, slug } });8return slug;9}1011export async function updateUser(slug: string, data: UserUpdateInput) {12await prisma.user.update({ where: { slug }, data });13}1415export async function deleteUser(slug: string) {16await prisma.user.delete({ where: { slug } });17}1819export const createSlug = (name: string) =>20name.toLowerCase().replace(/ /g, "-");
Tes routes dynamiques (users.$userSlug.tsx
) n’utilisent plus le faux tableau
db.users
; elles appellent maintenant ces helpers.
npm i prisma @prisma/client tsx
.prisma init
crée le schéma ; migrate dev
génère la table.output
dans le générateur.seed.ts
+ npx prisma db seed
pour injecter tes données de test.prisma
pour éviter les multiples connexions en dev (HMR).loader
/action
appellent désormais Prisma → données
persistées, pas de mock en mémoire.Quelle est la principale différence entre les composants client et serveur dans React ?
Quelle technique est recommandée pour éviter les rendus inutiles dans React ?
Quel hook permet de gérer les effets de bord dans un composant React ?
Comment implémenter la gestion des erreurs pour les requêtes API dans React ?
Quelle est la meilleure pratique pour déployer une application React en production ?