Lorsque je travaille sur des projets backend, la gestion des bases de données est une tâche centrale, mais souvent complexe. Prisma ORM simplifie cette interaction avec la base de données tout en offrant des fonctionnalités complémentaires qui rendent le développement plus fluide. Dans cet article, je vais vous expliquer pourquoi Prisma peut être un choix intéressant pour vos projets Nodejs.
Prisma transforme la manière dont je travaille avec les bases de données grâce à de nombreux atouts tels que :
- Simplicité et Productivité : Grâce à son langage de définition de schéma clair et à des commandes CLI intuitives, Prisma me permet de créer, gérer et migrer des bases de données rapidement.
- Alignement avec la logique métier : Avec des fonctionnalités comme les extensions et les champs calculés, Prisma facilite la centralisation et la réutilisation de la logique métier dans mes applications.
- Adaptabilité : Que je commence un nouveau projet ou que je travaille avec une base de données existante, Prisma peut s’adapter grâce à des commandes telles que
prisma db pull
qui permet de générer votre fichier de schéma Prisma etprisma studio
pour manager vos données dans une interface dédiée. - Simplicité d’utilisation : Prisma offre une interface intuitive et un écosystème d’outils qui rendent son adoption rapide, même pour des développeurs juniors (ou qui viennent du front).
- Approche centrée sur le schéma : La définition des modèles de données se fait dans un fichier
schema.prisma
, offrant une vue claire et centralisée de la structure de la base. Ce fichier devient la source de vérité pour mes données et permet de gérer facilement les relations, contraintes, et types. - Support de la génération automatique de types : Prisma génère des types TypeScript à partir du schéma via la commande
prisma generate
, ce qui garantit une interaction type-safe avec la base de données. Cela réduit les erreurs potentielles et améliore la productivité grâce à l’autocomplétion dans votre IDE et le Lint de votre projet. - Simplicité d’évolution des modèles : Avec son système de migration intégré, Prisma facilite les modifications des modèles de données. Par exemple, ajouter ou modifier un champ dans un modèle est simple et rapide.
Je vais explorer ces points en détail à travers des exemples concrets et des comparaisons avec d'autres ORMs. Nous allons également voir comment tirer parti des commandes CLI, utiliser les extensions pour enrichir vos modèles et intégrer Prisma dans un projet NestJS.
Voici un exemple simple pour illustrer l'utilisation de Prisma dans un service de ton application :
const user = await prisma.user.findUnique({
where: { id: 1 },
});
console.log(user);
Voici un modèle User
défini dans le fichier schema.prisma
:
model User {
id Int @id @default(autoincrement())
email String @unique
lastname String
firstname String
}
Une fois le modèle prêt, je peux générer et appliquer une migration avec la commande suivante :
npx prisma migrate dev --name init
Cette commande crée un fichier de migration décrivant les modifications apportées au schéma, les applique à la base de données et met à jour l’historique des migrations.
Ensuite, si je souhaite faire évoluer ce modèle et créer un fichier de migration associé :
- Je mets à jour simplement mon modèle dans le fichier
schema.prisma
model User {
id Int @id @default(autoincrement())
email String @unique
lastname String
firstname String
phone String ### Add phone attribute to User model
}
- Et je génère le typing associé et la migration
$ npx prisma generate
$ npx prisma migrate dev --name "add phone to user model"
Cet exemple simple permet de se rendre compte de la simplicité d’utilisation de cet outil.
Comparaison : Prisma vs TypeORM (ou un autre ORM)
Lorsque je choisis un ORM pour un projet, il est essentiel de comparer les différentes options disponibles. Prisma et TypeORM sont deux des ORMs les plus populaires, mais ils diffèrent sur plusieurs points clés.
1. Simplicité
Prisma se distingue par sa simplicité d’utilisation. Il repose sur un DSL (langage dédié) pour définir les modèles de données dans un fichier schema.prisma
. Ce schéma est facile à comprendre et à maintenir, centralisant toutes les informations relatives aux modèles et aux relations de la base de données.
En revanche, TypeORM utilise des annotations décorateurs directement sur les classes TypeScript, ce qui peut rendre la configuration plus complexe, surtout pour les relations ou les migrations. Je trouve la syntaxe de TypeORM plus difficile à maîtriser dans des projets complexes.

2. Performance
Prisma est conçu pour optimiser la gestion des requêtes et améliorer les performances. Il génère des requêtes SQL optimisées en fonction des modèles, ce qui permet de minimiser les erreurs et d’améliorer la vitesse d'exécution des requêtes. Prisma se concentre sur l'exécution rapide des requêtes grâce à des techniques comme le batching (deleteMany() updateMany() createMany() createManyAndReturn()
)
TypeORM, bien qu'il soit performant, ne bénéficie pas du même niveau d'optimisation des requêtes. Dans des applications à grande échelle, les requêtes générées par TypeORM peuvent être moins optimisées.
3. Écosystème
L'écosystème de Prisma est un autre de ses points forts. En plus du client ORM classique, Prisma offre des outils comme Prisma Studio (GUI qui permet de manager ses données), Prisma Migrate (pour gérer les migrations de schémas), et Prisma Introspection (pour importer une base de données existante). Ces outils facilitent de nombreuses tâches courantes dans la vie de votre projet.
TypeORM, bien qu'il offre des outils de migration et un support pour les bases de données relationnelles, n’a pas d’interface graphique intégrée comme peut l’avoir Prisma.
4. Transactions
En ce qui concerne les transactions, les deux ORMs facilitent leur utilisation, mais Prisma s’avere beaucoup moins verbeux et bien plus lisible. Ci-dessous, un exemple de comment effectuer une transaction pour créer un user
et lui associer des posts
avec Prisma puis TypeORM :
- Prisma :
const user = await prisma.user.create({
data: {
email: 'bob.rufus@prisma.io',
name: 'Bob Rufus',
Post: {
create: [
{ title: 'Working at Prisma' },
{ title: 'All about databases' },
],
},
},
})
- TypeORM :
await getConnection().$transaction(async (transactionalEntityManager) => {
const user = getRepository(User).create({
name: 'Bob',
email: 'bob@prisma.io',
})
const post1 = getRepository(Post).create({
title: 'Join us for GraphQL Conf in 2019',
})
const post2 = getRepository(Post).create({
title: 'Subscribe to GraphQL Weekly for GraphQL news',
})
user.posts = [post1, post2]
await transactionalEntityManager.save(post1)
await transactionalEntityManager.save(post2)
await transactionalEntityManager.save(user)
})
Prisma se distingue par sa simplicité, ses outils intégrés et ses optimisations de performance. Si vous recherchez un ORM facile à utiliser avec un écosystème complet, Prisma peut etre un excellent choix. TypeORM, bien qu'il soit flexible et puissant, peut être plus complexe à prendre en main et à utiliser au quotidien dans vos projets.
Les commandes principales du CLI Prisma
Plongeons-nous désormais dans les commandes principales du CLI pour comprendre l’étendue des capacités de Prisma. Nous verrons ensuite avec un exemple concret comment utiliser ces commandes sur un projet NestJS
- Initialisation du projet :
npx prisma init
Cette commande crée une configuration de base pour Prisma dans votre projet, incluant un fichier schema.prisma
et des fichiers de configuration pour votre base de données.
- Génération des types :
npx prisma generate
Cela génère des types TypeScript basés sur le schéma Prisma, garantissant une interaction type-safe avec la base de données.
- Introspection d’une base de données existante :
npx prisma db pull
Cette commande analyse la structure d'une base de données existante et met à jour le fichier schema.prisma
pour refléter les tables, colonnes et relations.
- Gestion des migrations :
npx prisma migrate dev
Cette commande applique les migrations à votre base de données et génère les fichiers nécessaires pour suivre les modifications apportées au schéma.
- Déploiement des migrations en production :
npx prisma migrate deploy
Cette commande applique toutes les migrations en attente à la base de données dans un environnement de production. Elle est utilisée pour synchroniser la base de données avec le schéma Prisma lors du déploiement de l’application.
En résumé, Prisma simplifie la gestion des bases de données grâce à une approche moderne centrée sur le type safety, des outils intuitifs pour les migrations et les interactions avec les données, ainsi qu’une intégration fluide dans vos projets TypeScript. Cet article a couvert ses principales fonctionnalités, comme le schéma centralisé, les extensions, et les commandes CLI, en mettant l’accent sur leur utilité pour le développement quotidien.
En outre, Prisma propose également des outils complémentaires qui n’ont pas été abordés ici, tels que Optimize pour analyser et optimiser vos requêtes. Accelerate pour améliorer les performances des bases de données à grande échelle, et Pulse pour surveiller leur état en temps réel et faire de l’event-base. Ces outils enrichissent l’écosystème Prisma et peuvent apporter une valeur ajoutée pour des besoins spécifiques ou avancés.