Yii - Migração de banco de dados
Durante o desenvolvimento de um aplicativo orientado a banco de dados, a estrutura do banco de dados evolui com o código-fonte. Yii fornece odatabase migration recurso que permite que você acompanhe as alterações do banco de dados.
O Yii fornece as seguintes ferramentas de linha de comando de migração -
- Crie novas migrações
- Reverter migrações
- Aplicar migrações
- Reaplicar migrações
- Mostrar status e histórico de migração
Criação de uma migração
Vamos criar uma nova migração de banco de dados.
Step 1 - Dentro da raiz do projeto do modelo de aplicativo básico, abra a janela do console e execute.
./yii migrate/create add_news_table
O comando acima irá criar um novo arquivo de migração (m160113_102634_add_news_table.php neste caso) no migrations pasta.
O arquivo contém o seguinte código -
<?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() {
}
*/
}
?>
Cada migração de banco de dados é uma classe PHP que estende o yii\db\Migrationclasse. O nome da classe é gerado no seguinte formato -
m<YYMMDD_HHMMSS>_<Name>
Onde <YYMMDD_HMMSS> é a data e hora UTC em que o comando de migração foi executado e <Nome> é o argumento fornecido no comando do console.
O método up () é chamado quando você atualiza seu banco de dados, enquanto o método down () é chamado quando você faz o downgrade dele.
Step 2 - Para adicionar uma nova tabela ao banco de dados, modifique o arquivo de migração desta forma.
<?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() {
}
*/
}
?>
No código acima, criamos uma nova tabela chamada news no up() método e largou esta tabela no down() método.
o newsA tabela consiste em três campos: id, título e conteúdo. Ao criar uma tabela ou coluna, devemos usar tipos abstratos para que as migrações sejam independentes de um tipo de banco de dados. Por exemplo, no caso do MySQL, TYPE_PK será convertido em int (11) NOT NUL AUTO_INCREMETN PRIMARY KEY.
Step 3 - Para atualizar um banco de dados, execute este comando.
./yii migrate
O comando acima listará todas as migrações disponíveis que ainda não foram aplicadas. Então, se você confirmar a aplicação das migrações, ele executará safeUp () ou up () em todas as novas classes de migração.
Step 4 - Para aplicar apenas três migrações disponíveis, você pode executar.
./yii migrate 3
Step 5 - Você também pode definir uma migração específica para a qual o banco de dados deve ser migrado.
# usando carimbo de data / hora para especificar a migração
yii migrate/to 160202_195501
# usando uma string que pode ser analisada por strtotime ()
yii migrate/to "2016-01-01 19:55:01"
# usando o nome completo
yii migrate/to m160202_195501_create_news_table
# usando carimbo de data / hora UNIX
yii migrate/to 1393964718
Step 6 - Para reverter uma migração (métodos execute down () ou safeDown ()), execute.
./yii migrate/down
Step 7 - Para reverter as cinco migrações aplicadas mais recentemente, você pode executar.
./yii migrate/down 5
Step 8 - Para refazer (reverter e aplicar novamente) migrações, execute.
./yii migrate/redo
Para listar as migrações já aplicadas, use estes comandos -
yii migrate/new # mostra as primeiras 10 novas migrações
yii migrate/new 3 # mostra as 3 primeiras novas migrações
yii migrate/new all # mostra todas as novas migrações
yii migrate/history # mostra as últimas 10 migrações aplicadas
yii migrate/history 20 # mostra as últimas 20 migrações aplicadas
yii migrate/history all # mostra todas as migrações aplicadas
Às vezes, você precisa adicionar ou eliminar uma coluna de uma tabela específica. Você pode usaraddColumn() e dropColumn() métodos.
Step 1 - Crie uma nova migração.
./yii migrate/create add_category_to_news
Step 2 - Modifique o arquivo de migração recém-criado dessa maneira.
<?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');
}
}
?>
Agora, se você correr ./yii migrate, a coluna da categoria deve ser adicionada à tabela de notícias. Pelo contrário, se você correr./yii migrate/down 1, a coluna da categoria deve ser eliminada.
Ao realizar migrações de banco de dados, é importante garantir que cada migração foi bem-sucedida ou falhou. Recomenda-se incluir operações de banco de dados em uma transação. Para implementar migrações transacionais, você deve apenas colocar o código de migração nosafeUp() e safeDown()métodos. Se alguma operação nesses métodos falhar, todas as operações anteriores serão revertidas.
O exemplo anterior na "forma transacional" será -
<?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');
}
}
?>
o yii\db\Migration classe fornece os seguintes métodos para manipular bancos de dados -
execute() - Executa uma instrução SQL bruta
createTable() - Cria uma mesa
renameTable() - Renomeia uma tabela
insert() - Insere uma única linha
batchInsert() - Insere várias linhas
update() - Atualiza linhas
delete() - Exclui linhas
addColumn() - Adiciona uma coluna
renameColumn() - Renomeia uma coluna
dropColumn() - remove uma coluna
alterColumn() - Altera uma coluna
dropTable() - Remove uma mesa
truncateTable() - Remove todas as linhas de uma tabela
createIndex() - Cria um índice
dropIndex() - Remove um índice
addPrimaryKey() - Adiciona uma chave primária
dropPrimaryKey() - Remove uma chave primária
addForeignKey() - Adiciona uma chave estrangeira
dropForeignKey() - Remove uma chave estrangeira