Prisma
Prisma est un ORM (Object-Relational Mapping) moderne qui simplifie la gestion des bases de données dans les projets Node.js. Contrairement aux ORM traditionnels, Prisma adopte une approche déclarative qui facilite la synchronisation entre votre code et votre base de données.
Pourquoi utiliser Prisma ?
Prisma offre de nombreux avantages :
- Facilité d'utilisation : Écriture simple et intuitive des requêtes grâce au Prisma Client.
- Type safety : Prisma génère automatiquement des types TypeScript basés sur votre schéma, réduisant les erreurs.
- Automatisation des migrations : Gestion des changements dans votre base de données avec un minimum d'effort.
- Performances optimisées : Prisma utilise des requêtes SQL optimisées.
Concepts de base de Prisma
Prisma repose sur trois composants principaux :
prisma/schema.prisma
: Un fichier.prisma
qui définit le modèle de données, les relations, et les configurations de la base de données.- Prisma Client : Un client généré automatiquement pour interagir avec la base de données à travers votre code.
- Prisma CLI : Un outil en ligne de commande pour gérer le schéma, les migrations, et bien plus.
Installation et initialisation
Pour ajouter Prisma à votre projet, vous pouvez utiliser:
npm install prisma --save-dev
npm install @prisma/client
Ensuite, initialisez Prisma dans votre projet :
npx prisma init
Cette commande crée deux fichiers principaux :
prisma/schema.prisma
: Le fichier principal pour définir votre modèle..env
: Un fichier de configuration pour les variables d'environnement, comme l'URL de votre base de données.
Comprendre les essentiels
Connecteur de base de données
Prisma prend en charge plusieurs connecteurs de base de données, tels que MySQL, PostgreSQL, SQLite, et SQL Server. Vous pouvez spécifier le connecteur dans le fichier schema.prisma
et le configurer dans le fichier .env
.:
datasource db {
provider = "sqlite"
url = env("DATABASE_URL")
}
DATABASE_URL="file:./dev.db"
Migration
Une migration Prisma correspond à un ensemble de modifications appliquées à une base de données pour aligner sa structure (tables, colonnes, relations, etc.) avec le modèle de données défini dans le fichier schema.prisma
. Ce processus est utilisé pour synchroniser le modèle Prisma avec la base de données, particulièrement dans les projets où le modèle évolue fréquemment.
- Créer un schéma : Dans le fichier
schema.prisma
vous pouvez définir un modèle correspondant à une table.
model User {
id Int @id @default(autoincrement())
email String @unique
name String
posts Post[] // Relation avec le modèle Post
}
model Post {
id Int @id @default(autoincrement())
title String
content String?
author User @relation(fields: [authorId], references: [id])
authorId Int
}
Si vous voulez plus de détails sur la gestion des relations, vous pouvez consulter la documentation officielle.
- Créer une migration :
npx prisma migrate dev --name init
Cette commande :- Génère un fichier de migration contenant les instructions SQL nécessaires.
- Applique les modifications à votre base de données.
Seed
Le seeding consiste à insérer des données initiales dans votre base, par exemple pour des tests ou un environnement de développement.
- Configurer le script de seed : Dans
package.json
, ajoutez :"prisma": { "seed": "ts-node prisma/seed.ts" }
- Créer le script de seed : Exemple de fichier
prisma/seed.ts
:
import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();
async function main() {
// Suppression de tous les posts
await prisma.user.deleteMany();
await prisma.post.deleteMany();
// Réinitialisation de l'auto-incrémentation
await prisma.$executeRaw`DELETE FROM sqlite_sequence WHERE name='User'`;
await prisma.$executeRaw`DELETE FROM sqlite_sequence WHERE name='Post'`;
// Création de plusieurs utilisateurs avec createMany
await prisma.user.createMany({
data: [
{
name: 'John Doe',
},
{
name: 'Jane Smith',
},
],
});
// Création de posts pour un utilisateur spécifique avec create
await prisma.post.create({
data: {
title: 'Premier Post de John',
authorId: 1, // ID de l'utilisateur John Doe
},
});
// Création de plusieurs posts avec createMany
await prisma.post.createMany({
data: [
{
title: 'Post collectif de John',
authorId: 1,
},
{
title: 'Deuxième post de Jane',
authorId: 2,
},
],
});
}
main()
.catch((e) => {
throw e;
})
.finally(async () => {
await prisma.$disconnect();
});
- Exécuter le seed :
npx prisma db seed
La commande
executeRaw
dans ce cas est nécessaire sur SQLite pour réinitialiser l'auto-incrémentation des ID après la suppression des données.
Generate
La commande generate
sert à recréer le Prisma Client lorsque votre schéma change. Sans cette commande, les modifications dans schema.prisma
ne seront pas reflétées dans votre code.
- Générer le client :
npx prisma generate
- Quand l'utiliser ? : Après toute modification du fichier
schema.prisma
ou lors de l'installation de nouvelles dépendances Prisma.
Utiliser le client
Dans votre fichier Typescript, vous pouvez utiliser le Prisma Client pour interagir avec la base de données.
import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();
app.get('/users', async (_req, res) => {
const users = await prisma.user.findMany({ include: { posts: true } }); // Récupère tous les utilisateurs et leurs posts
res.status(200).send(users);
});
La propriété
include
permet de spécifier les relations à inclure dans la requête.
Pattern singleton
Pour éviter de créer une nouvelle instance du Prisma Client à chaque requête, il est recommandé d'utiliser un pattern singleton pour garantir une seule instance partagée entre les requêtes. Faisons cela dans un fichier ./src/client.ts
:
import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();
export default prisma;
Prisma studio
Prisma Studio est un outil de visualisation de données qui vous permet d'explorer et de modifier les données de votre base de données. Pour lancer Prisma Studio, exécutez :
npx prisma studio
Commandes prisma client plus utiles
- Prisma Client
findMany
: Récupère plusieurs enregistrements.findUnique
: Récupère un enregistrement unique.create
: Crée un nouvel enregistrement.update
: Met à jour un enregistrement existant.delete
: Supprime un enregistrement.
- Prisma CLI
prisma migrate
: Gère les migrations.prisma db seed
: Exécute le script de seed.prisma generate
: Régénère le Prisma Client.prisma studio
: Lance Prisma Studio.