Migrations de bases de données en PHP : Guide complet des outils et bibliothèques

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 PHP : guide complet des outils et bibliothèques

\n\n

Le développement d'applications web en PHP est intrinsèquement lié à la gestion de la structure de la base de données. Au cours de l'évolution d'un projet, le schéma de la base de données change constamment : de nouvelles tables sont ajoutées, des champs sont modifiés, des index sont introduits. L'exécution manuelle de requêtes SQL sur différents environnements (environnement local, staging, production) entraîne des erreurs, des pertes de données et de la confusion. La solution à ce problème réside dans les migrations de bases de données — une méthode logicielle pour versionner et appliquer les modifications du schéma.

\n\n

Que sont les migrations et pourquoi en avez-vous besoin ?

\n

Une migration est une classe PHP contenant deux méthodes : up() (application des modifications) et down() (annulation des modifications). Chaque migration possède un identifiant unique (généralement un horodatage) et est exécutée séquentiellement. Les principaux avantages de l'utilisation des migrations :

\n
    \n
  • Versionnement du schéma de base de données — tout l'historique des modifications est stocké dans le code (généralement dans Git).
  • \n
  • Automatisation du déploiement — une seule commande suffit pour mettre à jour la base de données sur n'importe quel serveur.
  • \n
  • Sécurité — possibilité d'annuler les modifications non réussies.
  • \n
  • Travail d'équipe — tous les développeurs synchronisent automatiquement la structure de la base de données.
  • \n
\n\n

Bibliothèques populaires pour les migrations en PHP

\n

Examinons trois outils les plus courants : Phinx, Doctrine Migrations et les Laravel Migrations intégrées.

\n\n

1. Phinx (robmorgan/phinx)

\n

Phinx est un outil indépendant du framework pour les migrations et l'ensemencement (remplissage avec des données de test). Il prend en charge MySQL, PostgreSQL, SQLite, SQL Server et d'autres SGBD. L'installation se fait via Composer :

\n
composer require robmorgan/phinx
\n

Exemple de migration pour créer une table d'utilisateurs :

\n
<?php\nuse Phinx\\Migration\\AbstractMigration;\n\nclass CreateUsersTable extends AbstractMigration\n{\n    public function up()\n    {\n        $table = $this->table('users');\n        $table->addColumn('username', 'string', ['limit' => 50])\n              ->addColumn('email', 'string')\n              ->addColumn('password', 'string')\n              ->addColumn('created_at', 'datetime')\n              ->addIndex(['email'], ['unique' => true])\n              ->create();\n    }\n\n    public function down()\n    {\n        $this->table('users')->drop()->save();\n    }\n}
\n

Phinx fournit un DSL (langage dédié) pratique pour décrire le schéma, ainsi qu'un support intégré pour les seeders. Commandes principales :

\n
    \n
  • phinx migrate — appliquer toutes les nouvelles migrations.
  • \n
  • phinx rollback — annuler la dernière migration.
  • \n
  • phinx status — afficher le statut des migrations.
  • \n
  • phinx seed:run — remplir la base de données avec des données de test.
  • \n
\n\n

2. Doctrine Migrations

\n

Doctrine Migrations fait partie de l'écosystème Doctrine ORM, mais peut également être utilisé sans lui. Il se distingue par une intégration puissante avec Doctrine DBAL (couche d'abstraction de base de données). Installation :

\n
composer require doctrine/migrations
\n

Exemple de migration utilisant Doctrine DBAL :

\n
<?php\nuse Doctrine\\DBAL\\Migrations\\AbstractMigration;\nuse Doctrine\\DBAL\\Schema\\Schema;\n\nclass Version20240101000000 extends AbstractMigration\n{\n    public function up(Schema $schema)\n    {\n        $table = $schema->createTable('users');\n        $table->addColumn('id', 'integer', ['autoincrement' => true]);\n        $table->addColumn('username', 'string', ['length' => 50]);\n        $table->addColumn('email', 'string');\n        $table->setPrimaryKey(['id']);\n        $table->addUniqueIndex(['email']);\n    }\n\n    public function down(Sc                    

Recommendations