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