Node

Prisma

Introduction à Prisma, ses concepts de base, et ses commandes essentielles dans un projet Node.js

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

  1. 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.
  1. 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.