Migrations de bases de données dans Node.js : Aperçu des outils et exemples

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Migrations de bases de données en JavaScript (Node.js) : Outils et pratique

\n\n

Le 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\n

Dans 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\n

1. Knex.js — un constructeur de requêtes universel

\n\n

Knex.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\n

Installation et configuration

\n
npm install knex\nnpm install pg  # pour PostgreSQL
\n\n

Créons un fichier de configuration knexfile.js :

\n
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\n

Création et exécution d'une migration

\n

Créons une migration pour la table des utilisateurs :

\n
npx knex migrate:make create_users_table
\n\n

Un fichier avec un horodatage apparaîtra dans le dossier migrations. Modifions-le :

\n
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\n

Appliquons la migration :

\n
npx knex migrate:latest
\n\n

Annulation de la dernière migration :

\n
npx knex migrate:rollback
\n\n

Knex permet également d'exécuter du SQL pur à l'intérieur des migrations, si une logique spécifique est nécessaire.

\n\n

2. Sequelize — un ORM avec un puissant système de migrations

\n\n

Sequelize 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\n

Pour commencer

\n
npm install sequelize sequelize-cli pg\nnpx sequelize-cli init
\n\n

Créons un modèle et une migration en une seule commande :

\n
npx sequelize-cli model:generate --name User --attributes username:string,email:string
\n\n

Cela générera deux fichiers : un modèle models/user.js et une migration dans migrations/. Exemple de migration :

\n
'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\n

Application et annulation :

\n
npx sequelize-cli db:m                    

Recommendations