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