Yii - migracja bazy danych

Podczas tworzenia aplikacji opartej na bazie danych struktura bazy danych ewoluuje wraz z kodem źródłowym. Yii zapewniadatabase migration funkcja pozwalająca na śledzenie zmian w bazie danych.

Yii zapewnia następujące narzędzia wiersza poleceń migracji -

  • Utwórz nowe migracje
  • Przywróć migracje
  • Zastosuj migracje
  • Ponownie zastosuj migracje
  • Pokaż stan i historię migracji

Tworzenie migracji

Stwórzmy nową migrację bazy danych.

Step 1 - W katalogu głównym projektu podstawowego szablonu aplikacji otwórz okno konsoli i uruchom.

./yii migrate/create add_news_table

Powyższe polecenie utworzy nowy plik migracji (w tym przypadku m160113_102634_add_news_table.php) w migrations teczka.

Plik zawiera następujący kod -

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

Każda migracja bazy danych jest klasą PHP rozszerzającą yii\db\Migrationklasa. Nazwa klasy jest generowana w następującym formacie -

m<YYMMDD_HHMMSS>_<Name>

gdzie <YYMMDD_HMMSS> to data i godzina UTC, w której zostało wykonane polecenie migracji, a <nazwa> jest argumentem podanym w poleceniu konsoli.

Metoda up () jest wywoływana podczas aktualizacji bazy danych do nowej wersji, natomiast metoda down () jest wywoływana w przypadku jej obniżenia.

Step 2 - Aby dodać nową tabelę do bazy danych, zmodyfikuj w ten sposób plik migracji.

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

      }
      */
   }
?>

W powyższym kodzie utworzyliśmy nową tabelę o nazwie news w formacie up() metoda i upuściła tę tabelę w down() metoda.

Plik newstabela składa się z trzech pól: id, tytuł i zawartość. Tworząc tabelę lub kolumnę powinniśmy używać typów abstrakcyjnych, aby migracje były niezależne od typu bazy danych. Na przykład w przypadku MySQL TYPE_PK zostanie przekonwertowany na int (11) NOT NUL AUTO_INCREMETN PRIMARY KEY.

Step 3 - Aby zaktualizować bazę danych, uruchom to polecenie.

./yii migrate

Powyższe polecenie wyświetli listę wszystkich dostępnych migracji, które nie zostały jeszcze zastosowane. Następnie, jeśli potwierdzisz zastosowanie migracji, uruchomi on safeUp () lub up () we wszystkich nowych klasach migracji.

Step 4 - Aby zastosować tylko trzy dostępne migracje, możesz uruchomić.

./yii migrate 3

Step 5 - Można również zdefiniować konkretną migrację, do której ma zostać przeprowadzona migracja bazy danych.

# używając sygnatury czasowej do określenia migracji

yii migrate/to 160202_195501

# używając łańcucha, który może być przeanalizowany przez strtotime ()

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

# używając imienia i nazwiska

yii migrate/to m160202_195501_create_news_table

# przy użyciu sygnatury czasowej UNIX

yii migrate/to 1393964718

Step 6 - Aby cofnąć migrację (wykonaj metody down () lub safeDown ()), uruchom.

./yii migrate/down

Step 7 - Aby przywrócić pięć ostatnio zastosowanych migracji, możesz uruchomić.

./yii migrate/down 5

Step 8 - Aby ponowić (cofnąć, a następnie zastosować ponownie) migracje, uruchom.

./yii migrate/redo

Aby wyświetlić listę już zastosowanych migracji, użyj tych poleceń -

  • yii migrate/new # pokazuje pierwszych 10 nowych migracji

  • yii migrate/new 3 # pokazuje pierwsze 3 nowe migracje

  • yii migrate/new all # pokazuje wszystkie nowe migracje

  • yii migrate/history # pokazuje 10 ostatnich zastosowanych migracji

  • yii migrate/history 20 # pokazuje 20 ostatnich zastosowanych migracji

  • yii migrate/history all # pokazuje wszystkie zastosowane migracje

Czasami trzeba dodać lub usunąć kolumnę z określonej tabeli. Możesz użyćaddColumn() i dropColumn() metody.

Step 1 - Utwórz nową migrację.

./yii migrate/create add_category_to_news

Step 2 - Zmodyfikuj w ten sposób nowo utworzony plik migracji.

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

Teraz, jeśli uciekniesz ./yii migrate, kolumnę kategorii należy dodać do tabeli wiadomości. Wręcz przeciwnie, jeśli biegniesz./yii migrate/down 1, kolumnę kategorii należy usunąć.

Podczas wykonywania migracji bazy danych ważne jest, aby upewnić się, że każda migracja zakończyła się sukcesem lub niepowodzeniem. Zaleca się umieszczenie w transakcji operacji bazodanowych. Aby zaimplementować migracje transakcyjne, należy po prostu umieścić kod migracji w plikusafeUp() i safeDown()metody. Jeśli jakakolwiek operacja w tych metodach nie powiedzie się, wszystkie poprzednie operacje zostaną wycofane.

Poprzedni przykład w „sposób transakcyjny” będzie:

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

Plik yii\db\Migration klasa udostępnia następujące metody manipulowania bazami danych -

  • execute() - Wykonuje surową instrukcję SQL

  • createTable() - Tworzy tabelę

  • renameTable() - Zmienia nazwę tabeli

  • insert() - Wstawia pojedynczy wiersz

  • batchInsert() - Wstawia wiele wierszy

  • update() - Aktualizuje wiersze

  • delete() - usuwa wiersze

  • addColumn() - Dodaje kolumnę

  • renameColumn() - Zmienia nazwę kolumny

  • dropColumn() - Usuwa kolumnę

  • alterColumn() - Zmienia kolumnę

  • dropTable() - Usuwa tabelę

  • truncateTable() - Usuwa wszystkie wiersze z tabeli

  • createIndex() - Tworzy indeks

  • dropIndex() - usuwa indeks

  • addPrimaryKey() - Dodaje klucz podstawowy

  • dropPrimaryKey() - Usuwa klucz podstawowy

  • addForeignKey() - Dodaje klucz obcy

  • dropForeignKey() - Usuwa klucz obcy