Yii - Datenbankmigration
Während der Entwicklung einer datenbankgesteuerten Anwendung entwickelt sich die Datenbankstruktur mit dem Quellcode. Yii liefert diedatabase migration Funktion, mit der Sie Datenbankänderungen verfolgen können.
Yii bietet die folgenden Befehlszeilentools für die Migration:
- Erstellen Sie neue Migrationen
- Migrationen rückgängig machen
- Migrationen anwenden
- Migrationen erneut anwenden
- Migrationsstatus und -verlauf anzeigen
Erstellen einer Migration
Lassen Sie uns eine neue Datenbankmigration erstellen.
Step 1 - Öffnen Sie im Projektstamm der Basisanwendungsvorlage das Konsolenfenster und führen Sie es aus.
./yii migrate/create add_news_table
Mit dem obigen Befehl wird eine neue Migrationsdatei (in diesem Fall m160113_102634_add_news_table.php) in der Datei erstellt migrations Mappe.
Die Datei enthält den folgenden Code:
<?php
use yii\db\Schema;
use yii\db\Migration;
class m160113_102634_add_news_table extends Migration {
public function up() {
}
public function down() {
echo "m160113_102634_add_news_table cannot be reverted.\n";
return false;
}
/*
// Use safeUp/safeDown to run migration code within a transaction
public function safeUp() {
}
public function safeDown() {
}
*/
}
?>
Jede DB-Migration ist eine PHP-Klasse, die das erweitert yii\db\MigrationKlasse. Der Klassenname wird im folgenden Format generiert:
m<YYMMDD_HHMMSS>_<Name>
wo <YYMMDD_HMMSS> ist die UTC-Uhrzeit, zu der der Migrationsbefehl ausgeführt wurde, und <Name> ist das Argument, das Sie im Konsolenbefehl angegeben haben.
Die up () -Methode wird beim Upgrade Ihrer Datenbank aufgerufen, während die down () -Methode beim Downgrade aufgerufen wird.
Step 2 - Um der Datenbank eine neue Tabelle hinzuzufügen, ändern Sie die Migrationsdatei auf diese Weise.
<?php
use yii\db\Schema;
use yii\db\Migration;
class m160113_102634_add_news_table extends Migration {
public function up() {
$this->createTable("news", [
"id" => Schema::TYPE_PK,
"title" => Schema::TYPE_STRING,
"content" => Schema::TYPE_TEXT,
]);
}
public function down() {
$this->dropTable('news');
}
/*
// Use safeUp/safeDown to run migration code within a transaction
public function safeUp() {
}
public function safeDown() {
}
*/
}
?>
Im obigen Code haben wir eine neue Tabelle mit dem Namen news in the erstellt up() Methode und ließ diese Tabelle in der down() Methode.
Das newsDie Tabelle besteht aus drei Feldern: ID, Titel und Inhalt. Beim Erstellen einer Tabelle oder Spalte sollten abstrakte Typen verwendet werden, damit Migrationen unabhängig von einem Datenbanktyp sind. Im Fall von MySQL wird TYPE_PK beispielsweise in int (11) NOT NUL AUTO_INCREMETN PRIMARY KEY konvertiert.
Step 3 - Führen Sie diesen Befehl aus, um eine Datenbank zu aktualisieren.
./yii migrate
Mit dem obigen Befehl werden alle verfügbaren Migrationen aufgelistet, die noch nicht angewendet wurden. Wenn Sie dann bestätigen, dass Migrationen angewendet werden sollen, wird safeUp () oder up () in allen neuen Migrationsklassen ausgeführt.
Step 4 - Um nur drei verfügbare Migrationen anzuwenden, können Sie ausführen.
./yii migrate 3
Step 5 - Sie können auch eine bestimmte Migration definieren, zu der die Datenbank migriert werden soll.
# Verwenden Sie den Zeitstempel, um die Migration anzugeben
yii migrate/to 160202_195501
# mit einem String, der von strtotime () analysiert werden kann
yii migrate/to "2016-01-01 19:55:01"
# mit vollem Namen
yii migrate/to m160202_195501_create_news_table
# mit UNIX-Zeitstempel
yii migrate/to 1393964718
Step 6 - Um eine Migration zurückzusetzen (runde () oder safeDown () Methoden ausführen), führen Sie.
./yii migrate/down
Step 7 - Um die letzten fünf zuletzt angewendeten Migrationen zurückzusetzen, können Sie ausführen.
./yii migrate/down 5
Step 8 - Führen Sie Migrationen aus, um Migrationen zu wiederholen (zurückzusetzen und dann erneut anzuwenden).
./yii migrate/redo
Verwenden Sie diese Befehle, um die bereits angewendeten Migrationen aufzulisten:
yii migrate/new # zeigt die ersten 10 neuen Migrationen
yii migrate/new 3 # zeigt die ersten 3 neuen Migrationen
yii migrate/new all # zeigt alle neuen Migrationen an
yii migrate/history # zeigt die letzten 10 angewendeten Migrationen an
yii migrate/history 20 # zeigt die letzten 20 angewendeten Migrationen an
yii migrate/history all # zeigt alle angewendeten Migrationen an
Manchmal müssen Sie eine Spalte zu einer bestimmten Tabelle hinzufügen oder daraus entfernen. Sie können verwendenaddColumn() und dropColumn() Methoden.
Step 1 - Erstellen Sie eine neue Migration.
./yii migrate/create add_category_to_news
Step 2 - Ändern Sie die neu erstellte Migrationsdatei auf diese Weise.
<?php
use yii\db\Schema;
use yii\db\Migration;
class m160113_110909_add_category_to_news extends Migration {
public function up() {
$this->addColumn('news', 'category', $this->integer());
}
public function down() {
$this->dropColumn('news', 'category');
}
}
?>
Nun, wenn du rennst ./yii migratesollte die Kategoriespalte zur Nachrichtentabelle hinzugefügt werden. Im Gegenteil, wenn du rennst./yii migrate/down 1sollte die Kategoriespalte gelöscht werden.
Bei der Durchführung von DB-Migrationen ist es wichtig sicherzustellen, dass jede Migration erfolgreich war oder fehlgeschlagen ist. Es wird empfohlen, DB-Vorgänge in eine Transaktion einzuschließen. Um Transaktionsmigrationen zu implementieren, müssen Sie nur den Migrationscode in das Feld einfügensafeUp() und safeDown()Methoden. Wenn eine Operation in diesen Methoden fehlschlägt, werden alle vorherigen Operationen zurückgesetzt.
Das vorherige Beispiel in der "Transaktionsweise" wird sein -
<?php
use yii\db\Schema;
use yii\db\Migration;
class m160113_110909_add_category_to_news extends Migration {
public function safeUp() {
$this->addColumn('news', 'category', $this->integer());
}
public function safeDown() {
$this->dropColumn('news', 'category');
}
}
?>
Das yii\db\Migration Klasse bietet die folgenden Methoden zum Bearbeiten von Datenbanken:
execute() - Führt eine unformatierte SQL-Anweisung aus
createTable() - Erstellt eine Tabelle
renameTable() - Benennt eine Tabelle um
insert() - Fügt eine einzelne Zeile ein
batchInsert() - Fügt mehrere Zeilen ein
update() - Aktualisiert Zeilen
delete() - Löscht Zeilen
addColumn() - Fügt eine Spalte hinzu
renameColumn() - Benennt eine Spalte um
dropColumn() - Entfernt eine Spalte
alterColumn() - Ändert eine Spalte
dropTable() - Entfernt eine Tabelle
truncateTable() - Entfernt alle Zeilen in einer Tabelle
createIndex() - Erstellt einen Index
dropIndex() - Entfernt einen Index
addPrimaryKey() - Fügt einen Primärschlüssel hinzu
dropPrimaryKey() - Entfernt einen Primärschlüssel
addForeignKey() - Fügt einen Fremdschlüssel hinzu
dropForeignKey() - Entfernt einen Fremdschlüssel