Yii - Migration de base de données
Lors du développement d'une application basée sur une base de données, la structure de la base de données évolue avec le code source. Yii fournit ledatabase migration fonctionnalité qui vous permet de suivre les modifications de la base de données.
Yii fournit les outils de ligne de commande de migration suivants -
- Créer de nouvelles migrations
- Annuler les migrations
- Appliquer les migrations
- Réappliquer les migrations
- Afficher l'état et l'historique de la migration
Créer une migration
Créons une nouvelle migration de base de données.
Step 1 - À l'intérieur de la racine du projet du modèle d'application de base, ouvrez la fenêtre de la console et exécutez.
./yii migrate/create add_news_table
La commande ci-dessus créera un nouveau fichier de migration (m160113_102634_add_news_table.php dans ce cas) dans le migrations dossier.
Le fichier contient le code suivant -
<?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() {
}
*/
}
?>
Chaque migration de base de données est une classe PHP étendant le yii\db\Migrationclasse. Le nom de la classe est généré au format suivant -
m<YYMMDD_HHMMSS>_<Name>
où <YYMMDD_HMMSS> est la date UTC à laquelle la commande de migration a été exécutée et <Name> est l'argument que vous avez fourni dans la commande de console.
La méthode up () est appelée lorsque vous mettez à niveau votre base de données, tandis que la méthode down () est appelée lorsque vous la rétrogradez.
Step 2 - Pour ajouter une nouvelle table à la base de données, modifiez le fichier de migration de cette manière.
<?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() {
}
*/
}
?>
Dans le code ci-dessus, nous avons créé une nouvelle table appelée news dans le up() et a supprimé cette table dans le down() méthode.
le newstable se compose de trois champs: id, titre et contenu. Lors de la création d'une table ou d'une colonne, nous devons utiliser des types abstraits afin que les migrations soient indépendantes d'un type de base de données. Par exemple, dans le cas de MySQL, TYPE_PK sera converti en int (11) NOT NUL AUTO_INCREMETN PRIMARY KEY.
Step 3 - Pour mettre à niveau une base de données, exécutez cette commande.
./yii migrate
La commande ci-dessus répertorie toutes les migrations disponibles qui n'ont pas encore été appliquées. Ensuite, si vous confirmez d'appliquer les migrations, il exécutera safeUp () ou up () dans toutes les nouvelles classes de migration.
Step 4 - Pour appliquer uniquement trois migrations disponibles, vous pouvez exécuter.
./yii migrate 3
Step 5 - Vous pouvez également définir une migration particulière vers laquelle la base de données doit être migrée.
# utilisation de l'horodatage pour spécifier la migration
yii migrate/to 160202_195501
# en utilisant une chaîne qui peut être analysée par strtotime ()
yii migrate/to "2016-01-01 19:55:01"
# en utilisant le nom complet
yii migrate/to m160202_195501_create_news_table
# utilisation de l'horodatage UNIX
yii migrate/to 1393964718
Step 6 - Pour annuler une migration (exécutez les méthodes down () ou safeDown ()), exécutez.
./yii migrate/down
Step 7 - Pour annuler les cinq dernières migrations appliquées, vous pouvez exécuter.
./yii migrate/down 5
Step 8 - Pour refaire (revenir et appliquer à nouveau) les migrations, exécutez.
./yii migrate/redo
Pour lister les migrations déjà appliquées, utilisez ces commandes -
yii migrate/new # affiche les 10 premières nouvelles migrations
yii migrate/new 3 # affiche les 3 premières nouvelles migrations
yii migrate/new all # affiche toutes les nouvelles migrations
yii migrate/history # affiche les 10 dernières migrations appliquées
yii migrate/history 20 # affiche les 20 dernières migrations appliquées
yii migrate/history all # affiche toutes les migrations appliquées
Parfois, vous devez ajouter ou supprimer une colonne d'une table spécifique. Vous pouvez utiliseraddColumn() et dropColumn() méthodes.
Step 1 - Créez une nouvelle migration.
./yii migrate/create add_category_to_news
Step 2 - Modifiez le fichier de migration nouvellement créé de cette manière.
<?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');
}
}
?>
Maintenant, si tu cours ./yii migrate, la colonne de catégorie doit être ajoutée au tableau des actualités. Au contraire, si vous courez./yii migrate/down 1, la colonne de catégorie doit être supprimée.
Lors de l'exécution de migrations de bases de données, il est important de s'assurer que chaque migration a réussi ou échoué. Il est recommandé d'inclure les opérations DB dans une transaction. Pour implémenter des migrations transactionnelles, vous devez simplement mettre le code de migration dans lesafeUp() et safeDown()méthodes. Si une opération de ces méthodes échoue, toutes les opérations précédentes seront annulées.
L'exemple précédent de la «manière transactionnelle» sera -
<?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');
}
}
?>
le yii\db\Migration class fournit les méthodes suivantes pour manipuler les bases de données -
execute() - Exécute une instruction SQL brute
createTable() - Crée une table
renameTable() - Renomme une table
insert() - Insère une seule ligne
batchInsert() - Insère plusieurs lignes
update() - Met à jour les lignes
delete() - Supprime les lignes
addColumn() - Ajoute une colonne
renameColumn() - Renomme une colonne
dropColumn() - Supprime une colonne
alterColumn() - Modifie une colonne
dropTable() - Supprime une table
truncateTable() - Supprime toutes les lignes d'un tableau
createIndex() - Crée un index
dropIndex() - Supprime un index
addPrimaryKey() - Ajoute une clé primaire
dropPrimaryKey() - Supprime une clé primaire
addForeignKey() - Ajoute une clé étrangère
dropForeignKey() - Supprime une clé étrangère