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