ORM pour JavaScript (Node.js) : comparaison et exemples
Lors du développement d'applications serveur avec Node.js, l'interaction avec la base de données est l'une des tâches clés. L'Object-Relational Mapping (ORM) permet de travailler avec des bases de données relationnelles via des objets JavaScript, évitant ainsi d'écrire du SQL pur. Dans cet article, nous allons examiner trois ORM populaires : Sequelize, TypeORM et Prisma, comparer leurs caractéristiques et fournir des exemples pratiques.
1. Sequelize
Sequelize est l'un des ORM les plus anciens et les plus matures pour Node.js. Il prend en charge PostgreSQL, MySQL, MariaDB, SQLite et MSSQL. Il fonctionne avec les promesses et async/await.
Installation et configuration
npm install sequelize sequelize-clinpm install pg pg-hstore # pour PostgreSQLExemple de modèle et de requêtes
const { Sequelize, DataTypes } = require('sequelize');const sequelize = new Sequelize('postgres://user:pass@localhost:5432/mydb');
// Définition du modèleconst User = sequelize.define('User', { name: { type: DataTypes.STRING, allowNull: false }, email: { type: DataTypes.STRING, unique: true }});
// Création d'un enregistrementconst user = await User.create({ name: 'Ivan', email: 'ivan@example.com' });
// Recherche avec filtreconst users = await User.findAll({ where: { name: 'Ivan' } });
// Mise à jourawait User.update({ email: 'new@example.com' }, { where: { id: 1 } });Avantages et inconvénients
- + Grande communauté, beaucoup de documentation
- + Prise en charge des migrations et des seeds
- - Syntaxe lourde pour les requêtes complexes
- - Pas de prise en charge intégrée de TypeScript
2. TypeORM
TypeORM est un ORM orienté TypeScript, mais fonctionne également avec du JavaScript classique. Il prend en charge les décorateurs, l'enregistrement actif et le Data Mapper. Il fonctionne avec la plupart des SGBD populaires.
Installation et configuration
npm install typeorm reflect-metadatanpm install pg # pour PostgreSQLExemple de modèle avec décorateurs
import { Entity, PrimaryGeneratedColumn, Column, createConnection } from 'typeorm';
@Entity()export class User { @PrimaryGeneratedColumn() id: number;
@Column() name: string;
@Column({ unique: true }) email: string;}
// Utilisationconst connection = await createConnection();const userRepo = connection.getRepository(User);const user = await userRepo.save({ name: 'Anna', email: 'anna@example.com' });const users = await userRepo.find({ where: { name: 'Anna' } });Avantages et inconvénients
- + Excellente prise en charge de TypeScript
- + Deux approches : Active Record et Data Mapper
- - Configuration complexe pour les débutants
- - Migrations lentes dans les grands projets
3. Prisma
Prisma est un ORM moderne qui utilise son propre langage de schéma et génère un client typé sécurisé. Il est considéré comme le plus performant et le plus pratique pour les développeurs.
Installation et configuration
npm install @prisma/clientnpx prisma initDéfinition du schéma (schema.prisma)
model User { id Int @id @default(autoincrement()) name String email String @unique}Exemple de requêtes
import { PrismaClient } from '@prisma/client';const prisma = new PrismaClient();
// Créationconst user = await prisma.user.create({ data: { name: 'Olga', email: 'olga@example.com' }});
// Rechercheconst users = await prisma.user.findMany({ where: { name: 'Olga' } });
// Mise à jourawait prisma.user.update({ where: { id: 1 }, data: { email: 'new@example.com' }});Avantages et inconvénients
- + Sécurité de type complète