ORM pour JavaScript (Node.js) : comparaison et exemples
Lors du développement de la partie serveur avec Node.js, la question de l'interaction avec la base de données se pose tôt ou tard. Écrire des requêtes SQL pures est une tâche laborieuse et sujette aux erreurs. Les ORM (Object-Relational Mapping) viennent à la rescousse — des bibliothèques qui permettent de travailler avec les tables de bases de données comme avec des objets JavaScript ordinaires. Dans cet article, nous comparerons les trois ORM les plus populaires pour Node.js : Sequelize, TypeORM et Prisma, et fournirons des exemples de code concrets.
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 Microsoft SQL Server. Sequelize utilise une approche classique avec des modèles et des promesses (ou async/await).
Installation
npm install sequelize pg pg-hstoreExemple : définition d'un modèle et requête
const { Sequelize, DataTypes } = require('sequelize');const sequelize = new Sequelize('database', 'user', 'password', { host: 'localhost', dialect: 'postgres'});
const User = sequelize.define('User', { name: { type: DataTypes.STRING, allowNull: false }, email: { type: DataTypes.STRING, unique: true }});
async function createUser() { await sequelize.sync(); const user = await User.create({ name: 'Иван', email: 'ivan@example.com' }); console.log(user.toJSON());}createUser();Caractéristiques de Sequelize
- Maturité et grande communauté.
- Prise en charge des transactions, migrations et données d'amorçage.
- Système d'associations flexible (hasOne, hasMany, belongsToMany).
- Inconvénient : syntaxe parfois lourde et débogage complexe.
2. TypeORM
TypeORM est un ORM qui peut fonctionner aussi bien avec JavaScript qu'avec TypeScript. Il prend en charge les mêmes SGBD que Sequelize et propose deux approches : Active Record et Data Mapper. TypeORM utilise également activement les décorateurs, ce qui rend le code plus déclaratif.
Installation
npm install typeorm reflect-metadata pgExemple : modèle avec décorateur et requête
import { Entity, PrimaryGeneratedColumn, Column, createConnection } from 'typeorm';
@Entity()class User { @PrimaryGeneratedColumn() id: number;
@Column() name: string;
@Column({ unique: true }) email: string;}
async function createUser() { const connection = await createConnection({ type: 'postgres', host: 'localhost', database: 'test', entities: [User], synchronize: true }); const user = new User(); user.name = 'Мария'; user.email = 'maria@example.com'; await connection.manager.save(user); console.log(user);}createUser();Caractéristiques de TypeORM
- Excellente intégration avec TypeScript et les décorateurs.
- Flexibilité : choix entre Active Record et Data Mapper.
- Prise en charge des migrations, des abonnés aux événements et de la journalisation.
- Inconvénient : documentation parfois incomplète, changements cassants fréquents.
3. Prisma
Prisma est un ORM moderne qui diffère radicalement de ses prédécesseurs. Au lieu de modèles dans le code, vous décrivez le schéma de données dans un fichier spécial schema.prisma, et Prisma génère un client typé. Cela garantit l'autocomplétion dans l'IDE et un minimum d'erreurs.
Installation
npm install @prisma/clientnpx prisma initExemple : schéma et requête
schema.prisma :
datasource db { provider = "postgresql" url = env("DATABASE_URL")}
model User { id Int @id @default(autoincrement()) name String email String @unique}Code JavaScript :
const { PrismaClie