Migrations de bases de données en JavaScript (Node.js) : Outils et pratique
\n\nLe développement d'applications web modernes avec Node.js ne se fait que rarement sans travailler avec des bases de données. Au fur et à mesure que le projet grandit, la structure des tables, les index et les relations changent inévitablement. L'exécution manuelle de scripts SQL sur le serveur est une voie vers le chaos et les erreurs. La solution à ce problème est les migrations de bases de données (database migrations). Il s'agit d'un mécanisme de versionnement des modifications de schéma, permettant à une équipe de développeurs de mettre à jour la structure de la base de données de manière synchrone et sécurisée.
\n\nDans l'écosystème JavaScript, il existe plusieurs outils matures pour travailler avec les migrations. Examinons trois approches clés à l'aide d'exemples de bibliothèques populaires.
\n\n1. Knex.js — un constructeur de requêtes universel
\n\nKnex.js n'est pas seulement un constructeur SQL, mais aussi un outil complet pour les migrations et le seeding (remplissage avec des données de test). Il prend en charge PostgreSQL, MySQL, SQLite et d'autres SGBD. Le principal avantage est que vous écrivez les migrations en JavaScript, et Knex les traduit dans le dialecte de la base de données spécifique.
\n\nInstallation et configuration
\nnpm install knex\nnpm install pg # pour PostgreSQL\n\nCréons un fichier de configuration knexfile.js :
module.exports = {\n development: {\n client: 'pg',\n connection: {\n host: 'localhost',\n user: 'user',\n password: 'pass',\n database: 'mydb'\n },\n migrations: {\n directory: './migrations'\n }\n }\n};\n\nCréation et exécution d'une migration
\nCréons une migration pour la table des utilisateurs :
\nnpx knex migrate:make create_users_table\n\nUn fichier avec un horodatage apparaîtra dans le dossier migrations. Modifions-le :
exports.up = function(knex) {\n return knex.schema.createTable('users', (table) => {\n table.increments('id').primary();\n table.string('username', 100).notNullable().unique();\n table.string('email').notNullable();\n table.timestamps(true, true); // created_at et updated_at\n });\n};\n\nexports.down = function(knex) {\n return knex.schema.dropTableIfExists('users');\n};\n\nAppliquons la migration :
\nnpx knex migrate:latest\n\nAnnulation de la dernière migration :
\nnpx knex migrate:rollback\n\nKnex permet également d'exécuter du SQL pur à l'intérieur des migrations, si une logique spécifique est nécessaire.
\n\n2. Sequelize — un ORM avec un puissant système de migrations
\n\nSequelize est un ORM populaire pour Node.js, prenant en charge PostgreSQL, MySQL, MariaDB, SQLite et MSSQL. Son CLI fournit des commandes pratiques pour générer et gérer les migrations, étroitement intégrées aux modèles.
\n\nPour commencer
\nnpm install sequelize sequelize-cli pg\nnpx sequelize-cli init\n\nCréons un modèle et une migration en une seule commande :
\nnpx sequelize-cli model:generate --name User --attributes username:string,email:string\n\nCela générera deux fichiers : un modèle models/user.js et une migration dans migrations/. Exemple de migration :
'use strict';\nmodule.exports = {\n up: async (queryInterface, Sequelize) => {\n await queryInterface.createTable('Users', {\n id: {\n allowNull: false,\n autoIncrement: true,\n primaryKey: true,\n type: Sequelize.INTEGER\n },\n username: {\n type: Sequelize.STRING(100),\n allowNull: false,\n unique: true\n },\n email: {\n type: Sequelize.STRING,\n allowNull: false\n },\n createdAt: {\n allowNull: false,\n type: Sequelize.DATE\n },\n updatedAt: {\n allowNull: false,\n type: Sequelize.DATE\n }\n });\n },\n down: async (queryInterface, Sequelize) => {\n await queryInterface.dropTable('Users');\n }\n};\n\nApplication et annulation :
\nnpx sequelize-cli db:m Aussi dans la bibliothèque
Travailler avec Excel en JavaScript (Node.js) : bibliothèques et exemples de code
Client Elasticsearch pour Swift (iOS/macOS) : intégration et exemples
Internationalisation (i18n) en Rust : bibliothèques gettext-rs et fluent-rs
Files d'attente de tâches en TypeScript : aperçu des bibliothèques et implémentation
Mise en cache en C# (.NET) : Redis et autres solutions