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