Guide d'intégration de Prisma avec Next.js
13 janvier 2026
13 janvier 2026
Prisma est un ORM (Object-Relational Mapping) moderne et puissant pour Node.js et TypeScript. Il facilite l'interaction avec les bases de données en fournissant une API intuitive et des outils de génération de code.
Avant de commencer, vous devez avoir un projet Next.js avec TypeScript configuré. Si ce n'est pas le cas, vous pouvez créer un nouveau projet en vous référents à notre guide de démarrage avec Next.js et TypeScript.
Pour installer Prisma, vous devez d'abord ajouter les dépendances nécessaires à votre projet. Exécutez la commande suivante dans votre terminal :
pnpm install prisma tsx @types/pg --save-dev
pnpm install @prisma/client @prisma/adapter-pg dotenv pgEnsuite, initialisez Prisma dans votre projet avec la commande suivante :
npx prisma init --db --output ../generated/prismaRépondez aux questions pour configurer Prisma avec votre base de données.
- Would you like to authenticate? Yes
- Select your region: (your region) # Sélectionnez la région la plus proche de votre emplacement
- ? Enter a project name: (my-prisma-project) # Donnez un nom à votre projet PrismaCela créera :
prisma contenant un fichier schema.prisma.prisma.config.ts pour la configuration de Prisma..env pour la configuration de la base de données.Pour une base de données simple, vous pouvez définir votre schéma Prisma directement dans le fichier schema.prisma.
Si vous avez des modèles plus complexes, vous pouvez organiser vos modèles dans des fichiers séparés dans un dossier models à l'intérieur du dossier prisma.
Exemple simple :
Ouvrez le fichier schema.prisma et définissez vos modèles de données. Par exemple :
generator client {
provider = "prisma-client-js"
output = "../generated/prisma"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
posts Post[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model Post {
id Int @id @default(autoincrement())
title String
content String?
published Boolean @default(false)
authorId Int
author User @relation(fields: [authorId], references: [id])
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}Pour des schémas plus complexes :
Créez un dossier models dans prisma et ajoutez vos modèles de données. Par exemple, créez un fichier User.prisma et un fichier Post.prisma :
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
posts Post[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}model Post {
id Int @id @default(autoincrement())
title String
content String?
published Boolean @default(false)
authorId Int
author User @relation(fields: [authorId], references: [id])
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}Modifier le fichier prisma.config.ts :
// This file was generated by Prisma, and assumes you have installed the following:
// npm install --save-dev prisma dotenv
import "dotenv/config";
import { defineConfig } from "prisma/config";
export default defineConfig({
- schema: "prisma/schema.prisma",
+ schema: "prisma/",
migrations: {
path: "prisma/migrations",
},
datasource: {
url: process.env["DATABASE_URL"],
},
});Après avoir défini vos modèles, exécutez la commande suivante pour générer le client Prisma :
npx prisma generatePour appliquer les modifications de votre schéma à la base de données, vous devez créer et exécuter une migration. Utilisez la commande suivante :
npx prisma migrate dev --name initCela créera une migration initiale et appliquera les changements à la base de données.
Vous pouvez utiliser Prisma Studio pour visualiser et interagir avec votre base de données.
Lancez Prisma Studio avec la commande suivante :
npx prisma studioVous pouvez maintenant utiliser le client Prisma dans votre code. Par exemple, créez un fichier src/lib/database/prisma.client.ts :
import { PrismaClient } from '@/generated/prisma'
const globalForPrisma = globalThis as unknown as { prisma: PrismaClient };
export const prisma =
globalForPrisma.prisma || new PrismaClient();
if (process.env.NODE_ENV !== "production") globalForPrisma.prisma = prisma;Vous pouvez utiliser le client Prisma pour interagir avec votre base de données. Par exemple, pour créer un nouvel utilisateur :
import { prisma } from './prisma.client';
async function createUser() {
const newUser = await prisma.user.create({
data: {
email: 'user@example.com',
name: 'John Doe',
},
});
console.log(newUser);
}
createUser();Créez un fichier prisma/seed.ts pour insérer des données initiales dans votre base de données :
import { prisma } from '@/lib/database/prisma.client';
async function main() {
await prisma.user.create({
data: {
email: 'user@example.com',
name: 'John Doe',
},
});
}
main()
.catch(e => {
console.error(e);
process.exit(1);
})
.finally(async () => {
await prisma.$disconnect();
});Pour exécuter le seed, utilisez la commande suivante :
npx prisma migrate dev --seedconst user = await prisma.user.create({
data: {
email: 'user@example.com',
name: 'John Doe',
},
});// Récupérer tous les utilisateurs
const users = await prisma.user.findMany();
// Récupérer un utilisateur par ID
const user = await prisma.user.findUnique({
where: { id: 1 },
});
// Récupérer des utilisateurs avec filtres
const users = await prisma.user.findMany({
where: {
email: {
contains: '@example.com',
},
},
orderBy: {
createdAt: 'desc',
},
take: 10,
});const updatedUser = await prisma.user.update({
where: { id: 1 },
data: {
name: 'Jane Doe',
},
});const deletedUser = await prisma.user.delete({
where: { id: 1 },
});// Créer un post avec relation
const post = await prisma.post.create({
data: {
title: 'Mon premier post',
content: 'Contenu du post',
author: {
connect: { id: 1 },
},
},
});
// Récupérer un utilisateur avec ses posts
const userWithPosts = await prisma.user.findUnique({
where: { id: 1 },
include: {
posts: true,
},
});# Générer le client Prisma
npx prisma generate --schema=./prisma
# Créer une nouvelle migration
npx prisma migrate dev --name nom_de_la_migration --schema=./prisma
# Appliquer les migrations en production
npx prisma migrate deploy --schema ./prisma
# Réinitialiser la base de données (⚠️ supprime toutes les données)
npx prisma migrate reset --force --skip-seed --schema ./prisma
# Ouvrir Prisma Studio (interface graphique)
npx prisma studio --schema ./prisma
# Formater le schéma Prisma
npx prisma format --schema=./prisma
# Valider le schéma Prisma
npx prisma validate --schema=./prisma
# Synchroniser le schéma avec la base de données (dev uniquement)
npx prisma db push --schema=./prisma
# Créer une migration à partir de la base de données existante
npx prisma db pull --schema=./prismaPour la production, utilisez une URL de connexion sécurisée :
# Production
DATABASE_URL="postgresql://user:password@host:5432/db?sslmode=require&connection_limit=5&pool_timeout=10"
# Avec Prisma Accelerate (cache et connection pooling)
DATABASE_URL="prisma://accelerate.prisma-data.net/?api_key=your_api_key"
Pour les environnements serverless (Vercel, AWS Lambda), utilisez le connection pooling :
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
directUrl = env("DIRECT_DATABASE_URL") // URL directe sans pooling
}DATABASE_URL="postgresql://user:password@host:5432/db?pgbouncer=true"
DIRECT_DATABASE_URL="postgresql://user:password@host:5432/db"
// Utiliser select pour ne récupérer que les champs nécessaires
const users = await prisma.user.findMany({
select: {
id: true,
name: true,
email: true,
},
});
// Utiliser pagination
const users = await prisma.user.findMany({
skip: 20,
take: 10,
});
// Utiliser cursor-based pagination
const users = await prisma.user.findMany({
take: 10,
cursor: {
id: lastUserId,
},
skip: 1, // Skip the cursor
});// lib/database/prisma.client.ts
import { PrismaClient } from '@/generated/prisma'
const globalForPrisma = globalThis as unknown as { prisma: PrismaClient };
export const prisma =
globalForPrisma.prisma ||
new PrismaClient({
log: process.env.NODE_ENV === 'development' ? ['query', 'error', 'warn'] : ['error'],
});
if (process.env.NODE_ENV !== "production") globalForPrisma.prisma = prisma;import { Prisma } from '@/generated/prisma';
try {
const user = await prisma.user.create({
data: {
email: 'user@example.com',
name: 'John Doe',
},
});
} catch (error) {
if (error instanceof Prisma.PrismaClientKnownRequestError) {
// Erreur unique constraint
if (error.code === 'P2002') {
console.log('Un utilisateur avec cet email existe déjà');
}
}
throw error;
}// Transaction avec plusieurs opérations
const result = await prisma.$transaction(async (tx) => {
const user = await tx.user.create({
data: {
email: 'user@example.com',
name: 'John Doe',
},
});
const post = await tx.post.create({
data: {
title: 'Premier post',
authorId: user.id,
},
});
return { user, post };
});// Ajouter un timestamp automatique
prisma.$use(async (params, next) => {
if (params.action === 'create' || params.action === 'update') {
params.args.data.updatedAt = new Date();
}
return next(params);
});model User {
id Int @id @default(autoincrement())
email String @unique
name String?
deletedAt DateTime? // Pour le soft delete
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}// Middleware pour exclure les éléments supprimés
prisma.$use(async (params, next) => {
if (params.action === 'findMany' || params.action === 'findFirst') {
params.args.where = {
...params.args.where,
deletedAt: null,
};
}
return next(params);
});
// Soft delete
const softDeleteUser = await prisma.user.update({
where: { id: 1 },
data: { deletedAt: new Date() },
});-- migration.sql
-- Ajouter une colonne avec valeur par défaut
ALTER TABLE "User" ADD COLUMN "role" TEXT NOT NULL DEFAULT 'USER';
-- Mettre à jour des données existantes
UPDATE "User" SET "role" = 'ADMIN' WHERE "email" LIKE '%@admin.com';# Revenir à une migration spécifique
npx prisma migrate resolve --rolled-back "20230101000000_migration_name" --schema=./prisma
# Appliquer une migration marquée comme échouée
npx prisma migrate resolve --applied "20230101000000_migration_name" --schema=./prismaSolutions :
DATABASE_URL dans .envpsql "postgresql://user:password@localhost:5432/mydb"Solutions :
# Réinitialiser complètement la base de données
pnpm prisma-migrate-reset
# Ou marquer la migration comme appliquée
npx prisma migrate resolve --applied "migration_name" --schema=./prismaSolution :
# Regénérer le client Prisma
pnpm prisma-generateSolution :
# Push les changements directement (dev uniquement)
npx prisma db push --schema=./prisma
# Ou créer une nouvelle migration
pnpm prisma-migrateVous avez maintenant une configuration Prisma complète avec :
Prisma vous permet de gérer votre base de données de manière efficace, sécurisée et type-safe !