Yii - Migrazione del database

Durante lo sviluppo di un'applicazione basata su database, la struttura del database si evolve con il codice sorgente. Yii fornisce ildatabase migration funzionalità che consente di tenere traccia delle modifiche al database.

Yii fornisce i seguenti strumenti da riga di comando per la migrazione:

  • Crea nuove migrazioni
  • Ripristina le migrazioni
  • Applica migrazioni
  • Riapplica le migrazioni
  • Mostra lo stato e la cronologia della migrazione

Creazione di una migrazione

Creiamo una nuova migrazione del database.

Step 1 - All'interno della radice del progetto del modello dell'applicazione di base, apri la finestra della console ed esegui.

./yii migrate/create add_news_table

Il comando precedente creerà un nuovo file di migrazione (m160113_102634_add_news_table.php in questo caso) nel migrations cartella.

Il file contiene il codice seguente:

<?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() {
   
      }
      */
   }
?>

Ogni migrazione di DB è una classe PHP che estende l'estensione yii\db\Migrationclasse. Il nome della classe viene generato nel seguente formato:

m<YYMMDD_HHMMSS>_<Name>

dove <YYMMDD_HMMSS> è il datetime UTC in cui è stato eseguito il comando di migrazione e <Name> è l'argomento fornito nel comando della console.

Il metodo up () viene invocato quando si aggiorna il database, mentre il metodo down () viene chiamato quando lo si esegue il downgrade.

Step 2 - Per aggiungere una nuova tabella al database, modificare il file di migrazione in questo modo.

<?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() {

      }
      */
   }
?>

Nel codice sopra abbiamo creato una nuova tabella chiamata news in up() e ha rilasciato questa tabella nel file down() metodo.

Il newstable è composta da tre campi: id, title e content. Quando si crea una tabella o una colonna, è necessario utilizzare tipi astratti in modo che le migrazioni siano indipendenti da un tipo di database. Ad esempio, nel caso di MySQL, TYPE_PK verrà convertito in int (11) NOT NUL AUTO_INCREMETN PRIMARY KEY.

Step 3 - Per aggiornare un database, eseguire questo comando.

./yii migrate

Il comando precedente elencherà tutte le migrazioni disponibili che non sono state ancora applicate. Quindi, se confermi di applicare le migrazioni, verrà eseguito safeUp () o up () in tutte le nuove classi di migrazione.

Step 4 - Per applicare solo tre migrazioni disponibili, puoi eseguire.

./yii migrate 3

Step 5 - È inoltre possibile definire una particolare migrazione in cui migrare il database.

# utilizzando il timestamp per specificare la migrazione

yii migrate/to 160202_195501

# usando una stringa che può essere analizzata da strtotime ()

yii migrate/to "2016-01-01 19:55:01"

# utilizzando il nome completo

yii migrate/to m160202_195501_create_news_table

# utilizzando il timestamp UNIX

yii migrate/to 1393964718

Step 6 - Per annullare una migrazione (eseguire i metodi down () o safeDown ()), eseguire.

./yii migrate/down

Step 7 - Per ripristinare le ultime cinque migrazioni applicate di recente, è possibile eseguire.

./yii migrate/down 5

Step 8 - Per ripetere (ripristinare e quindi applicare di nuovo) le migrazioni, eseguire.

./yii migrate/redo

Per elencare le migrazioni già applicate, utilizzare questi comandi:

  • yii migrate/new # mostra le prime 10 nuove migrazioni

  • yii migrate/new 3 # mostra le prime 3 nuove migrazioni

  • yii migrate/new all # mostra tutte le nuove migrazioni

  • yii migrate/history # mostra le ultime 10 migrazioni applicate

  • yii migrate/history 20 # mostra le ultime 20 migrazioni applicate

  • yii migrate/history all # mostra tutte le migrazioni applicate

A volte è necessario aggiungere o eliminare una colonna da una tabella specifica. Puoi usareaddColumn() e dropColumn() metodi.

Step 1 - Crea una nuova migrazione.

./yii migrate/create add_category_to_news

Step 2 - Modifica il file di migrazione appena creato in questo modo.

<?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');
      }
   }
?>

Ora, se corri ./yii migrate, la colonna della categoria dovrebbe essere aggiunta alla tabella delle notizie. Al contrario, se corri./yii migrate/down 1, la colonna della categoria dovrebbe essere eliminata.

Quando si eseguono migrazioni di database, è importante assicurarsi che ogni migrazione abbia avuto esito positivo o negativo. Si consiglia di racchiudere le operazioni DB in una transazione. Per implementare le migrazioni transazionali, è sufficiente inserire il codice di migrazione nel filesafeUp() e safeDown()metodi. Se qualsiasi operazione in questi metodi fallisce, verrà eseguito il rollback di tutte le operazioni precedenti.

L'esempio precedente in "modo transazionale" sarà:

<?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');
      }
   }
?>

Il yii\db\Migration class fornisce i seguenti metodi per manipolare i database:

  • execute() - Esegue un'istruzione SQL non elaborata

  • createTable() - Crea una tabella

  • renameTable() - Rinomina una tabella

  • insert() - Inserisce una singola riga

  • batchInsert() - Inserisce più righe

  • update() - Aggiorna le righe

  • delete() - Elimina le righe

  • addColumn() - Aggiunge una colonna

  • renameColumn() - Rinomina una colonna

  • dropColumn() - Rimuove una colonna

  • alterColumn() - Altera una colonna

  • dropTable() - Rimuove un tavolo

  • truncateTable() - Rimuove tutte le righe in una tabella

  • createIndex() - Crea un indice

  • dropIndex() - Rimuove un indice

  • addPrimaryKey() - Aggiunge una chiave primaria

  • dropPrimaryKey() - Rimuove una chiave primaria

  • addForeignKey() - Aggiunge una chiave esterna

  • dropForeignKey() - Rimuove una chiave esterna