Aller au contenu principal

6-1 Créer et exécuter des seeds

En FluentMigrator, un seed est une migration. C'est-à-dire que l'insertion des données se fait à même les fichiers de migration et ces derniers sont exécutés au même moment.

Il y a quelques façons d'intégrer ces derniers à votre projet, mais de notre côté, nous allons simplement créer des fichiers séparés, associés aux migrations pertinentes.

Créer un fichier de Seed

Créer un seed pour les villes

Dans un premier temps, imaginons que nous voulions insérer des données de test pour les villes. Insérer quelques villes prédéfinies dans la base de données bref.

Cette insertion de données doit se faire après la migration responsable de créer la table villes. En effet, il faut que la table existe avant d'insérer des données 😉

  1. Créer une classe sous le dossier Migrations et nommez la SeedVilles
  2. Renommez le fichier avec un numéro de migration, mais assurez-vous de lui donner un numéro de migration qui la positionne entre CreerVilles et CreerEvemenents de cette façon: img
  3. Créez ensuite la base d'une migration normale,
    Snowfall.Data/Migrations/202501310930_SeedVilles.cs
        using FluentMigrator;

    namespace Snowfall.Data.Migrations;

    [Migration(202501310930)]
    public class SeedVilles : Migration
    {
    public override void Up()
    {
    throw new NotImplementedException();
    }

    public override void Down()
    {
    throw new NotImplementedException();
    }
    }

Insérer des données

On peut ensuite procéder à une insertion de données de la façon suivante:

Snowfall.Data/Seeds/SeedData.cs
using FluentMigrator;

namespace Snowfall.Data.Migrations;

[Migration(202501310930)]
public class SeedVilles : Migration
{
public override void Up()
{
Insert.IntoTable("villes").Row(new
{
nom = "Vegas, NV",
pays_iso = "US"
});

Insert.IntoTable("villes").Row(new
{
nom = "Montreal, QC",
pays_iso = "CA"
});
}

public override void Down()
{
throw new NotImplementedException();
}
}

Version Down()

Pour un seed de données, la fonction Down() représente simplement la suppression de toutes les entrées!

Il est possible de faire cela facilement avec FluentMigrator.

Snowfall.Data/Migrations/202501310930_SeedVilles.cs
public override void Down()
{
Delete.FromTable("villes").AllRows();
}

Insérer des données relationnelles

Imaginons que nous voulions insérer des données relationnelles, comme par exemple un événement qui est lié à une ville.

Pour cela, on doit spécifier manuellement les id. Il serait préférable de pouvoir obtenir une référence aux différents id des villes insérés et ensuite de pouvoir les utiliser, mais cela est malheureusement une limitation de FluentMigrator.

On peut cependant assumer que la première entrée insérée d'une table aura le id 1, ensuite 2 et ainsi de suite.

Donc, nous pourrions faire quelque chose comme ceci:

  1. Créer une nouvelle migration SeedEvenements

  2. Renommez le fichier avec un numéro de version qui positionnera la migration à la toute fin, soit après AjouterColonneVilleAEvenements

  3. Créez une migration de base

    Snowfall.Data/Migrations/202502041517_SeedEvenements.cs
    using FluentMigrator;

    namespace Snowfall.Data.Migrations;

    [Migration(202502041517)]
    public class SeedEvenements : Migration
    {
    public override void Up()
    {
    throw new NotImplementedException();
    }

    public override void Down()
    {
    throw new NotImplementedException();
    }
    }
  4. Ajouter l'insertion de données dans la fonction Up()

    Snowfall.Data/Migrations/202502041517_SeedEvenements.cs
    using FluentMigrator;

    namespace Snowfall.Data.Migrations;

    [Migration(202502041517)]
    public class SeedEvenements : Migration
    {
    public override void Up()
    {
    Insert.IntoTable("evenements").Row(new
    {
    nom = "What happens in Vegas",
    description = "Stays in Vegas",
    prix = 30.00,
    capacite = 4000,
    date = DateTime.Now,
    ville_id = 1,
    });
    }

    public override void Down()
    {
    Delete.FromTable("evenements").AllRows();
    }
    }
    info

    Remarquez la ligne ville_id = 1, c'est à cette ligne que le lien avec la ville est fait de façon manuelle.

Utiliser un enum

Pour rendre le tout plus propre, vous pourriez utiliser des enum référençant les différents id attendus. Par exemple:

Snowfall.Data/Migrations/202502041517_SeedEvenements.cs
[Migration(202502041517)]
public class SeedEvenements : Migration
{
private enum Villes
{
Vegas = 1,
}

public override void Up()
{
Insert.IntoTable("evenements").Row(new
{
nom = "What happens in Vegas",
description = "Stays in Vegas",
prix = 30.00,
capacite = 4000,
date = DateTime.Now,
ville_id = (int) Villes.Vegas,
});
}

//...

level up