Migrations de bases de données en TypeScript : aperçu complet des outils et guide pratique
\n\nLes migrations de bases de données sont un moyen de versionner et d'appliquer séquentiellement les modifications du schéma de base de données (création, modification ou suppression de tables, d'index et de contraintes). Dans l'écosystème TypeScript, il existe plusieurs outils puissants pour gérer les migrations. Dans cet article, nous allons détailler trois solutions les plus populaires : TypeORM, Prisma et Drizzle ORM.
\n\nPourquoi les migrations sont-elles nécessaires ?
\nSans migrations, les développeurs apportent souvent des modifications manuellement via la console SQL ou l'interface d'administration, ce qui entraîne :
\n- \n
- Une perte de synchronisation entre l'environnement de développement et la production ; \n
- Des erreurs dues au facteur humain ; \n
- Des difficultés lors de l'annulation des modifications. \n
Les migrations résolvent ces problèmes en permettant d'appliquer et d'annuler automatiquement les modifications, ainsi que de stocker l'historique de toutes les modifications du schéma dans le code.
\n\n1. TypeORM — approche classique avec ActiveRecord et Data Mapper
\nTypeORM est l'un des ORM les plus matures pour TypeScript et JavaScript. Il prend en charge à la fois le modèle ActiveRecord et Data Mapper, et dispose d'un système de migration intégré.
\n\nInstallation et configuration
\nnpm install typeorm reflect-metadata @types/node\nnpm install pg # pour PostgreSQL\n\nCréez un fichier de configuration ormconfig.json ou utilisez data-source.ts :
import { DataSource } from "typeorm";\n\nexport const AppDataSource = new DataSource({\n type: "postgres",\n host: "localhost",\n port: 5432,\n username: "user",\n password: "password",\n database: "mydb",\n entities: ["src/entity/*.ts"],\n migrations: ["src/migration/*.ts"],\n synchronize: false, // désactive la synchronisation automatique\n});\n\nCréation et exécution d'une migration
\nGénérez d'abord une migration basée sur les modifications des entités :
\nnpx typeorm migration:generate src/migration/AddUserTable -d src/data-source.ts\n\nExemple de migration générée :
\nimport { MigrationInterface, QueryRunner, Table } from "typeorm";\n\nexport class AddUserTable1234567890 implements MigrationInterface {\n public async up(queryRunner: QueryRunner): Promise<void> {\n await queryRunner.createTable(\n new Table({\n name: "user",\n columns: [\n { name: "id", type: "int", isPrimary: true, isGenerated: true, generationStrategy: "increment" },\n { name: "name", type: "varchar", length: "255" },\n { name: "email", type: "varchar", isUnique: true },\n ],\n })\n );\n }\n\n public async down(queryRunner: QueryRunner): Promise<void> {\n await queryRunner.dropTable("user");\n }\n}\n\nAppliquez la migration :
\nnpx typeorm migration:run -d src/data-source.ts\n\nAvantages et inconvénients de TypeORM
\n- \n
- Avantages : vaste écosystème, nombreuses bases de données (PostgreSQL, MySQL, SQLite, MSSQL), génération de migrations à partir des entités. \n
- Inconvénients : configuration complexe, lenteur avec un grand nombre d'entités, base de code obsolète. \n
2. Prisma — ORM moderne avec migrations automatiques
\nPrisma est le nouveau standard des ORM TypeScript. Il utilise un schéma déclaratif (schema.prisma) et génère automatiquement les migrations.
Installation et initialisation
\nnpm install prisma @prisma/client\nnpx prisma init\n\nDéfinissez le modèle dans prisma/schema.prisma :
generator client {\n provider = "prisma-client-js"\n}\n\ndatasource db {\n provider = "postgresql"\n url = env("DATABASE_URL")\n}\n\nmodel User {\n id Aussi dans la bibliothèque
Polars pour Rust : guide complet avec exemples
Joi pour JavaScript (Node.js) : guide complet avec exemples
Catch2 Matchers C++ : guide complet avec exemples
Travailler avec S3 et les stockages cloud en Kotlin : AWS SDK et Ktor S3 Client