Datenbankmigration mit Yii

Neben einem SQL-Query-Builder beschert uns die aktuelle 1.1.6er Version des Yii-Frameworks einen feinen neuen Command zur Datenbankmigration. Hiermit wird uns zum einen das Versionieren und Einspielen von Datenbankänderungen vereinfacht und somit das Arbeiten in Teams gefördert, zum anderen die Unabhängigkeit zum verwendeten DBMS gewahrt (insofern man hierfür nicht einen eigenen Command in Verbindung mit CDbCommand genutzt hat).

Wir wollen zu Demonstrationszwecken einfach mal eine User-Profil-Migration erstellen. Hierzu tippen wir einfach folgenden Befehl in die Konsole:

yiic migrate create create_user_structure

create_user_structure stellt dabei nur den Namen der Migration dar. Hier kann also jeder x-beliebige Wert benutzt werden. Im Verzeichnis protected/migrates ist nun eine Datei im Format m<timestamp>_create_user_structrure.php erstellt worden, die eine gleichnamige Klasse mit den beiden Methoden up() und down() enthält.

Die beiden Methoden werden bei der Migration benötigt. up() bei einem Upgrade und down() bei einem Downgrade. Kümmern wir uns also erst einmal um die Funktionalität für das Upgrade. Hierzu befüllen wir unsere up()-Methode einfach wie folgt:

$this->createTable('User', array(
    'id'       => 'pk',
    'name'     => 'string NOT NULL',
    'password' => 'string NOT NULL',
    'salt'     => 'string NOT NULL',
));
 
$this->createTable('Profile', array(
    'id'          => 'pk',
    'userId'      => 'integer NOT NULL',
    'firstname'   => 'string',
    'lastname'    => 'string',
    'email'       => 'string',
    'description' => 'text',
));
 
$this->addForeignKey('user', 'Profile', 'userId', 'User', 'id', 'CASCADE', 'CASCADE');

Ich denke der Code ist relativ selbstredend. Wir erstellen die beiden Tabellen User und Profile und fügen zu guter Letzt noch den Fremdschlüssel userId aus der Profile-Tabelle hinzu. Alle verfügbaren Methoden und Spaltentypen können hier und hier nachgeschlagen werden.

Bei einem Downgrade müssen wir ja nicht mehr machen als die beiden erstellten Tabellen wieder zu löschen. Die down()-Methode sieht also relativ unspektakulär aus:

$this->dropTable('User');
$this->dropTable('Profile');

Ist in der Konsolenkonfiguration die Datenbankverbindung bereits vorhanden war es das auch schon mit dem Programmieren. Wieder zur Konsole gewechselt,

yiic migrate

getippt, die zu migrierende Version bestätigt und sich über die erstellten Tabellen in der Datenbank freuen.

So können wir nun weiterhin jegliche Datenbankänderungen auch im eigentlichen Code festhalten, ohne irgendwelche Dumps aktualisieren zu müssen und brauchen jeweils nur noch den migrate-Befehl auf der Konsole auszuführen um unsere Datenbank aktuell zu halten. Arbeiten wir in Teams und nutzen bspw. Versionierungstools wie Subversion reicht es nach jedem Update einfach ein

yiic migrate new

auszuführen um über die neusten und noch nicht eingespielten Datenbankänderungen informiert zu werden.

Zum Schluss sei noch erwähnt, dass Yii bei der ersten Migration auch automatisch die Tabelle tbl_migration erstellt um eine History der durchgeführten Migrationen zu speichern. Möchten wir den Namen dieser Tabelle ändern müssen wir in der Konsolenkonfiguration Folgendes einfügen:

'commandMap' => array(
    'migrate' => array(
        'class'          => 'system.cli.commands.MigrateCommand',
        'migrationTable' => 'YiiMigration',
    ),
),

Das war es denn auch schon. Alles ziemlich einfach, dafür aber um so nützlicher. Weitere Infos sind im entsprechenden Kapitel des Yii-Guides zu finden.

Schlagworte: , , ,

Kommentieren