Yii - Migración de base de datos

Durante el desarrollo de una aplicación impulsada por una base de datos, la estructura de la base de datos evoluciona con el código fuente. Yii proporciona eldatabase migration función que le permite realizar un seguimiento de los cambios en la base de datos.

Yii proporciona las siguientes herramientas de línea de comandos de migración:

  • Crea nuevas migraciones
  • Revertir migraciones
  • Aplicar migraciones
  • Volver a aplicar migraciones
  • Mostrar el historial y el estado de la migración

Crear una migración

Creemos una nueva migración de base de datos.

Step 1 - Dentro de la raíz del proyecto de la plantilla de la aplicación básica, abra la ventana de la consola y ejecútela.

./yii migrate/create add_news_table

El comando anterior creará un nuevo archivo de migración (m160113_102634_add_news_table.php en este caso) en el migrations carpeta.

El archivo contiene el siguiente 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 migración de DB es una clase PHP que extiende el yii\db\Migrationclase. El nombre de la clase se genera en el siguiente formato:

m<YYMMDD_HHMMSS>_<Name>

dónde <YYMMDD_HMMSS> es la fecha y hora UTC en la que se ejecutó el comando de migración y <Nombre> es el argumento que proporcionó en el comando de la consola.

El método up () se invoca cuando actualiza su base de datos, mientras que el método down () se invoca cuando la degrada.

Step 2 - Para agregar una nueva tabla a la base de datos, modifique el archivo de migración de esta manera.

<?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() {

      }
      */
   }
?>

En el código anterior creamos una nueva tabla llamada noticias en el up() método y dejó esta tabla en el down() método.

los newsLa tabla consta de tres campos: id, título y contenido. Al crear una tabla o una columna debemos utilizar tipos abstractos para que las migraciones sean independientes de un tipo de base de datos. Por ejemplo, en el caso de MySQL, TYPE_PK se convertirá en int (11) NOT NUL AUTO_INCREMETN PRIMARY KEY.

Step 3 - Para actualizar una base de datos, ejecute este comando.

./yii migrate

El comando anterior enumerará todas las migraciones disponibles que aún no se han aplicado. Luego, si confirma aplicar las migraciones, se ejecutará safeUp () o up () en todas las nuevas clases de migración.

Step 4 - Para aplicar solo tres migraciones disponibles, puede ejecutar.

./yii migrate 3

Step 5 - También puede definir una migración particular a la que se debe migrar la base de datos.

# uso de marca de tiempo para especificar la migración

yii migrate/to 160202_195501

# usando una cadena que puede ser analizada por strtotime ()

yii migrate/to "2016-01-01 19:55:01"

# usando el nombre completo

yii migrate/to m160202_195501_create_news_table

# usando la marca de tiempo UNIX

yii migrate/to 1393964718

Step 6 - Para revertir una migración (ejecutar los métodos down () o safeDown ()), ejecute.

./yii migrate/down

Step 7 - Para revertir las cinco migraciones aplicadas más recientemente, puede ejecutar.

./yii migrate/down 5

Step 8 - Para rehacer (revertir y luego aplicar nuevamente) migraciones, ejecute.

./yii migrate/redo

Para enumerar las migraciones ya aplicadas, use estos comandos:

  • yii migrate/new # muestra las primeras 10 nuevas migraciones

  • yii migrate/new 3 # muestra las 3 primeras migraciones nuevas

  • yii migrate/new all # muestra todas las migraciones nuevas

  • yii migrate/history # muestra las últimas 10 migraciones aplicadas

  • yii migrate/history 20 # muestra las últimas 20 migraciones aplicadas

  • yii migrate/history all # muestra todas las migraciones aplicadas

A veces es necesario agregar o quitar una columna de una tabla específica. Puedes usaraddColumn() y dropColumn() métodos.

Step 1 - Cree una nueva migración.

./yii migrate/create add_category_to_news

Step 2 - Modifique el archivo de migración recién creado de esta manera.

<?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');
      }
   }
?>

Ahora, si corres ./yii migrate, la columna de categoría debe agregarse a la tabla de noticias. Al contrario, si corres./yii migrate/down 1, la columna de categoría debe descartarse.

Al realizar migraciones de bases de datos, es importante asegurarse de que cada migración haya tenido éxito o no. Se recomienda incluir operaciones de base de datos en una transacción. Para implementar migraciones transaccionales, simplemente debe colocar el código de migración en elsafeUp() y safeDown()métodos. Si alguna operación de estos métodos falla, todas las operaciones anteriores se revertirán.

El ejemplo anterior de la "forma transaccional" 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');
      }
   }
?>

los yii\db\Migration La clase proporciona los siguientes métodos para manipular bases de datos:

  • execute() - Ejecuta una declaración SQL sin formato

  • createTable() - Crea una mesa

  • renameTable() - Cambia el nombre de una mesa

  • insert() - Inserta una sola fila

  • batchInsert() - Inserta varias filas

  • update() - Actualiza filas

  • delete() - Elimina filas

  • addColumn() - Agrega una columna

  • renameColumn() - Cambia el nombre de una columna

  • dropColumn() - Elimina una columna

  • alterColumn() - Altera una columna

  • dropTable() - Elimina una mesa

  • truncateTable() - Elimina todas las filas de una tabla

  • createIndex() - Crea un índice

  • dropIndex() - Elimina un índice

  • addPrimaryKey() - Agrega una clave primaria

  • dropPrimaryKey() - Elimina una clave principal

  • addForeignKey() - Agrega una clave externa

  • dropForeignKey() - Elimina una clave externa