Laravel: migracje i siew danych produkcyjnych

Moja aplikacja potrzebuje wstępnie zarejestrowanego zestawu danych do działania. Więc muszę je wstawić do bazy danych podczas konfigurowania aplikacji.

Laravel zaproponuj dwa mechanizmy:

  • migracje Baz Danych : "pozwalają one zespołowi modyfikować schemat bazy danych i być na bieżąco z aktualnym stanem schematu."
  • pozycjonowanie Baz Danych : "Laravel zawiera również prosty sposób na zalanie bazy danych za pomocą danych testowych przy użyciu materiału siewnego klasy."

Kiedy czytam ten opis, żadne z tych rozwiązań nie wydaje się być dostosowane.

Podobne pytanie zostało zadane w stackoverflow i odpowiedział . Odpowiedź proponuje użycie filtra a do wypełnienia bazy danych poprzez wykrycie bieżącego środowiska:

<?php

class DatabaseSeeder extends Seeder {

    public function run()
    {
            Eloquent::unguard();

            if (App::environment() === 'production')
            {
                $this->call('ProductionSeeder');
            }
            else
            {
                $this->call('StagingSeeder');
            }
    }

}
Oczywiście to rozwiązanie działa. Ale nie jestem pewien, czy jest to właściwy sposób, ponieważ wstawiając dane za pomocą siewników tracisz wszystkie korzyści płynące z mechanizmu migracji (upgrate bazy danych, rollback...) Chcę wiedzieć, jaka jest najlepsza praktyka w tym przypadku.
Author: Community, 2014-02-05

2 answers

Rozwój Laravela polega na wolności. Jeśli więc potrzebujesz zasiać swoją bazę danych produkcji i uważasz, że DatabaseSeeder jest najlepszym miejscem, aby to zrobić, dlaczego nie?

Ok, seeder jest używany głównie z danymi testowymi, ale zobaczysz, że niektórzy używają go tak, jak ty.

Widzę ten ważny rodzaj zalążka jako część mojej migracji, ponieważ jest to coś, co nie może być poza moimi tabelami bazodanowymi i artisan migrate jest uruchamiane za każdym razem, gdy wdrażam nową wersję mojej aplikacji, więc po prostu robię

php artisan migrate:make seed_models_table

I stwórz w nim mój seedind:

public function up()
{
    $models = array(
        array('name' => '...'),
    );

    DB::table('models')->insert($models);
}
 52
Author: Antonio Carlos Ribeiro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-05 15:00:05

Często zastanawiałem się, jaka jest właściwa odpowiedź na to pytanie. Osobiście unikałbym stosowania wysiewu do wypełniania wymaganych wierszy w bazie danych, ponieważ będziesz musiał włożyć ładunek logiki warunkowej, aby upewnić się, że nie spróbujesz wypełnić czegoś, co już tam jest. (Usuwanie i odtwarzanie danych jest Bardzo niewskazane, ponieważ możesz skończyć z kluczowymi niedopasowaniami, a jeśli używasz kaset kaskadowych, możesz przypadkowo usunąć obciążenie swojej bazy danych mój błąd! ;-)

Umieściłem "zaszywanie" wierszy w skrypcie migracji, ponieważ są szanse, że dane będą musiały tam być w ramach procesu wdrażania.

Warto zauważyć, że powinieneś używać klasy DB zamiast wymownych modeli do wypełniania tych danych, ponieważ struktura klasy może się zmieniać w czasie, co uniemożliwi ponowne tworzenie bazy danych od podstaw (bez przepisywania historii i zmieniania plików migracji, co jestem pewien, że jest złe.)

I ' d tend to go with something like this:

public function up()
{
    DB::beginTransaction();

    Schema::create(
        'town',
        function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->timestamps();
        }
    );

    DB::table('town')
        ->insert(
            array(
                array('London'),
                array('Paris'),
                array('New York')
            )
        );

    Schema::create(
        'location',
        function (Blueprint $table) {
            $table->increments('id');
            $table->integer('town_id')->unsigned()->index();
            $table->float('lat');
            $table->float('long');
            $table->timestamps();

            $table->foreign('town_id')->references('id')->on('town')->onDelete('cascade');
        }
    );

    DB::commit();
}

To pozwala mi łatwo "zasiać" tabelę miasta, gdy po raz pierwszy ją tworzę, i nie będzie przeszkadzać w jakichkolwiek dodatkach do niej w czasie uruchamiania.

 27
Author: Dan B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-13 13:29:17