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