ORM pour TypeScript : Comparaison et exemples d'utilisation
Dans le développement moderne en TypeScript, le choix du bon ORM (Object-Relational Mapping) est une décision fondamentale qui impacte les performances, la lisibilité du code et la vitesse de développement. Dans cet article, nous comparerons en détail les trois ORM les plus populaires pour TypeScript : Prisma, TypeORM et MikroORM. Vous découvrirez leurs forces et faiblesses, verrez des exemples de code et obtiendrez des recommandations pratiques pour votre projet.
1. Prisma — le standard moderne
Prisma est un ORM de nouvelle génération qui utilise son propre langage de schéma déclaratif. Il génère automatiquement un client type-safe basé sur votre schéma de base de données. Prisma prend en charge PostgreSQL, MySQL, SQLite, SQL Server et MongoDB.
Avantages :
- Système de typage puissant — toutes les requêtes sont vérifiées à la compilation
- Migrations intégrées et éditeur visuel Prisma Studio
- Documentation excellente et communauté active
- Autocomplétion dans l'IDE
Inconvénients :
- Étape supplémentaire de génération du client
- Moins de flexibilité pour les requêtes SQL complexes
- Taille du paquet relativement importante
Exemple de code :
// schema.prismamodel User { id Int @id @default(autoincrement()) email String @unique name String? posts Post[]}
model Post { id Int @id @default(autoincrement()) title String content String? authorId Int author User @relation(fields: [authorId], references: [id])}// app.tsimport { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();
async function main() { // Création d'un utilisateur avec un article const user = await prisma.user.create({ data: { email: 'alice@example.com', name: 'Alice', posts: { create: { title: 'Hello World' } } }, include: { posts: true } });
// Recherche avec filtrage const users = await prisma.user.findMany({ where: { email: { contains: 'alice' } }, orderBy: { name: 'asc' } });
console.log(users);}
main();2. TypeORM — le vétéran éprouvé
TypeORM est l'un des plus anciens ORM pour TypeScript, inspiré par Hibernate et Entity Framework. Il utilise des décorateurs pour définir les entités et prend en charge les modèles Active Record et Data Mapper. Il fonctionne avec la plupart des bases de données relationnelles.
Avantages :
- Système de décorateurs flexible
- Prise en charge des migrations et de la synchronisation des schémas
- Grand nombre d'intégrations et d'extensions
- Projet mature et éprouvé par le temps
Inconvénients :
- Typage moins strict comparé à Prisma
- Configuration complexe pour les débutants
- Développement plus lent récemment
Exemple de code :
// entity/User.tsimport { Entity, PrimaryGeneratedColumn, Column, OneToMany } from 'typeorm';import { Post } from './Post';
@Entity()export class User { @PrimaryGeneratedColumn() id: number;
@Column({ unique: true }) email: string;
@Column({ nullable: true }) name: string;
@OneToMany(() => Post, (post) => post.author) posts: Post[];}// app.tsimport { createConnection } from 'typeorm';import { User } from './entity/User';
async function main() { const connection = await createConnection(); const userRepo = connection.getRepository(User);
// Création const user = userRepo.create({ email: 'bob@example.com', name: 'Bob' }); await userRepo.save(user);
// Recherche const users = await userRepo.find({ where: { name: Like('%Bob%') }, relations: ['posts'] });
console.log(users);}
main();