Datenbankmigrationen in PHP: Vollständiger Leitfaden zu Tools und Bibliotheken

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Datenbankmigrationen in PHP: Vollständiger Leitfaden zu Tools und Bibliotheken

\n\n

Die Entwicklung von Webanwendungen in PHP ist untrennbar mit der Verwaltung der Datenbankstruktur verbunden. Im Laufe der Projektentwicklung ändert sich das DB-Schema ständig: Neue Tabellen werden hinzugefügt, Felder geändert, Indizes eingeführt. Die manuelle Ausführung von SQL-Abfragen in verschiedenen Umgebungen (lokal, Staging, Produktion) führt zu Fehlern, Datenverlust und Verwirrung. Die Lösung für dieses Problem sind Datenbankmigrationen – eine programmatische Methode zur Versionierung und Anwendung von Schemaänderungen.

\n\n

Was sind Migrationen und warum werden sie benötigt?

\n

Eine Migration ist eine PHP-Klasse, die zwei Methoden enthält: up() (Änderungen anwenden) und down() (Änderungen rückgängig machen). Jede Migration hat eine eindeutige Kennung (normalerweise ein Zeitstempel) und wird sequenziell ausgeführt. Die Hauptvorteile der Verwendung von Migrationen:

\n
    \n
  • Versionierung des DB-Schemas – der gesamte Änderungsverlauf wird im Code gespeichert (normalerweise in Git).
  • \n
  • Automatisierung der Bereitstellung – ein einziger Befehl reicht aus, um die DB auf jedem Server zu aktualisieren.
  • \n
  • Sicherheit – Möglichkeit, fehlgeschlagene Änderungen rückgängig zu machen.
  • \n
  • Teamarbeit – alle Entwickler synchronisieren die DB-Struktur automatisch.
  • \n
\n\n

Beliebte Bibliotheken für Migrationen in PHP

\n

Betrachten wir die drei am weitesten verbreiteten Tools: Phinx, Doctrine Migrations und die integrierten Laravel Migrations.

\n\n

1. Phinx (robmorgan/phinx)

\n

Phinx ist ein frameworkunabhängiges Tool für Migrationen und Seeding (Befüllen mit Testdaten). Es unterstützt MySQL, PostgreSQL, SQLite, SQL Server und andere DBMS. Die Installation erfolgt über Composer:

\n
composer require robmorgan/phinx
\n

Beispiel einer Migration zum Erstellen einer Benutzertabelle:

\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 bietet eine praktische DSL (Domain-Specific Language) zur Beschreibung des Schemas sowie integrierte Unterstützung für Seeds (Seeder). Die wichtigsten Befehle:

\n
    \n
  • phinx migrate – alle neuen Migrationen anwenden.
  • \n
  • phinx rollback – die letzte Migration rückgängig machen.
  • \n
  • phinx status – den Status der Migrationen anzeigen.
  • \n
  • phinx seed:run – die DB mit Testdaten befüllen.
  • \n
\n\n

2. Doctrine Migrations

\n

Doctrine Migrations ist Teil des Doctrine ORM-Ökosystems, kann aber auch ohne dieses verwendet werden. Es zeichnet sich durch eine leistungsstarke Integration mit Doctrine DBAL (Abstraktionsschicht für Datenbanken) aus. Installation:

\n
composer require doctrine/migrations
\n

Beispiel einer Migration mit 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                    

Empfehlungen