Aller au contenu principal

5-11 Oops, colonne ville_id

Oopsy... on a oublié la colonne ville_id dans la migration de la table evenements.

On pourrait revenir en arrière (MigrateDown()), modifier la classe CreerEvenements et réexécuter les migrations (MigrateUp()), mais quelle belle occasion pour montrer qu'il est possible de créer une migration pour ajouter la colonne manquante! 😉

  1. Sous le dossier Migrations, dans le projet Snowfall.Data, créez une nouvelle classe pour la migration N'oubliez pas de nommer le fichier et la version selon la convention YYYYMMDDHHMM.

    Snowfall.Data/Migrations/202302041343_AjouterColonneVilleAEvenements.cs
    using FluentMigrator;

    namespace Snowfall.Data.Migrations;

    [Migration(202302041343)]
    public class AjouterColonneVilleAEvenements : Migration
    {
    public override void Up()
    {
    // Up
    }

    public override void Down()
    {
    // Down
    }
    }
  2. Créer la colonne. À l'image de Create.Table(), on il existe Create.Column(), fonction pour laquelle on peut ensuite préciser sur quelle table via OnTable():

    public override void Up()
    {
    Create.Column("ville_id")
    .OnTable("evenements")
    .AsInt64();
    }
  3. Créer la FK. Pour créer la clé étrangère, une fonction Create.ForeignKey() est disponible.

    public override void Up()
    {
    Create.Column("ville_id")
    .OnTable("evenements")
    .AsInt64();

    Create.ForeignKey()
    .FromTable("evenements").ForeignColumn("ville_id")
    .ToTable("villes").PrimaryColumn("id");
    }
    info

    Il est nécessaire de préciser FromTable() et ForeignColumn(), puis ToTable() et PrimaryColumn() afin d'identifier la contrainte de clé étrangère.

    astuce

    Une fonction de migration Up() ou Down() peut contenir plusieurs instructions. Ici, on crée la colonne et ensuite la clé étrangère.

  4. Fonction Down(). Pour compléter la migration, la fonction Down() doit premièrement supprimer la contrainte de clé étrangère, puis ensuite supprimer la colonne. En effet, on effectue les opérations dans l'ordre inverse de la création. Si on essaie de supprimer la colonne, cela génèrera une erreur puisque cela briserait la contrainte de clé étrangère.

    public override void Down()
    {
    Delete.ForeignKey()
    .FromTable("evenements").ForeignColumn("ville_id")
    .ToTable("villes").PrimaryColumn("id");

    Delete.Column("ville_id").FromTable("evenements");
    }
    info

    La syntaxe est exactement la même que pour Up(), mais on utilise Delete plutôt que Create.

Lancer le projet

Lancez le projet et dans la console Debug, vous pourrez remarquer:

-------------------------------------------------------------------------------
202302041343: AjouterColonneVilleAEvenements migrating
-------------------------------------------------------------------------------
info: FluentMigrator.Runner.Processors.Postgres.PostgresProcessor[1004]
Beginning Transaction
Beginning Transaction
info: FluentMigrator.Runner.MigrationRunner[1004]
//highlight-next-line
CreateColumn evenements ville_id Int64
CreateColumn evenements ville_id Int64
info: FluentMigrator.Runner.Processors.Postgres.PostgresProcessor[1003]
//highlight-next-line
ALTER TABLE "public"."evenements" ADD "ville_id" bigint NOT NULL;
info: FluentMigrator.Runner.MigrationRunner[1002]
=> 0.011876s
info: FluentMigrator.Runner.MigrationRunner[1004]
//highlight-next-line
CreateForeignKey FK_evenements_ville_id_villes_id evenements(ville_id) villes(id)
CreateForeignKey FK_evenements_ville_id_villes_id evenements(ville_id) villes(id)
info: FluentMigrator.Runner.Processors.Postgres.PostgresProcessor[1003]
//highlight-next-line
ALTER TABLE "public"."evenements" ADD CONSTRAINT "FK_evenements_ville_id_villes_id" FOREIGN KEY ("ville_id") REFERENCES "public"."villes" ("id");
info: FluentMigrator.Runner.MigrationRunner[1002]
=> 0.01294s
info: FluentMigrator.Runner.Processors.Postgres.PostgresProcessor[1003]
INSERT INTO "public"."VersionInfo" ("Version","AppliedOn","Description") VALUES (202302041343,'2023-02-04T18:59:13','AjouterColonneVilleAEvenements');
info: FluentMigrator.Runner.Processors.Postgres.PostgresProcessor[1004]
Committing Transaction
Committing Transaction
202302041343: AjouterColonneVilleAEvenements migrated
info

Dans un premier temps, la colonne ville_id est créée, ensuite la clé étrangère et finalement la contrainte sont appliquées.

Remarquez que le nom de la contrainte est automatiquement nommé FK_evenements_ville_id_villes_id sans que nous ayons eu à préciser quoi que ce soit.

Le format de FK par défaut dans Postgres est FK_[table]_[colonne FK]_[colonne clé primaire].

level up