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
![](https://post.nghiatu.com/assets/tutorial/yii/images/upgrade_database.jpg)
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
![](https://post.nghiatu.com/assets/tutorial/yii/images/revert_migration.jpg)
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
![](https://post.nghiatu.com/assets/tutorial/yii/images/redo_migration.jpg)
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