Laravel 5 - передача данных MySQL из Dev в Staging/Production

У меня есть этот вопрос, над которым я часами ломал голову... Я создал приложение Laravel 5.4, которое готово к тестированию на стадии. Я могу создать базу данных и запустить миграцию. Итак, вопрос в том, как передать данные из Dev в Staging, а затем в Production?

У меня есть таблица под названием «регионы», в которой перечислены все регионы в этом районе, такие как «Сан-Франциско», «Восточный залив», «Южный залив» и так далее. Я знаю, что есть обходные пути, такие как импорт файла sql или Laravel Seeding, но я просто хочу знать, как это сделать правильно.

Заранее спасибо.


person Ken Xu    schedule 29.07.2018    source источник
comment
Файл SQL будет быстрее, но для развертывания и повторного развертывания может быть лучше иметь данные в миграции (или семени). Зависит от того, сколько у вас данных, я полагаю, или от того, можете ли вы написать скрипт, чтобы выполнить миграцию за вас.   -  person sdexp    schedule 29.07.2018


Ответы (1)


Обычно вы не переносите данные из одной среды в другую. Однако если вам нужно заполнить базу данных данными, есть несколько подходов, которые вы можете использовать, и, похоже, у вас уже есть некоторый опыт их использования.

Сеялка

Обратите внимание, что сеялка работает не так, как миграция, сеялка будет запускаться каждый раз, когда вы вводите команду php artisan db:seed, что может не совпадать с тем, что вам нужно в процессе развертывания, поскольку это часто приводит к дублированию данных. Его основное использование — повторное заполнение вашей базы данных во время разработки. В этом случае я бы рекомендовал вместо этого использовать миграцию.

Я видел, как многие приложения используют сеялки с условными операторами, чтобы решить, следует ли раздавать данные в зависимости от текущей среды:

class MyTableSeeder extends Seeder
{
    if (in_array(config('env'), ['production', 'staging'])) {
        // Seed data for production or staging
    } elseif (config('env') == 'dev') {
        // Seed data only for dev environment
    }

    // Seed data for ALL environments (Production, staging, dev) etc. You get the picture
}

Я видел, как некоторые создают свои собственные элементы конфигурации и вспомогательные функции, чтобы определить, следует ли переносить данные, вместо того, чтобы просто полагаться на элемент конфигурации env, поэтому вы вместо этого увидите что-то подобное в сеялке вместо проверки операторов if значение элемента конфигурации env:

if (should_seed_data()) {
    // Seed data here
}

Это добавляет немного большей гибкости к возможности указывать, следует ли заполнять определенные данные, независимо от env, на которое в данный момент установлено приложение.

Миграция (рекомендуется)

Если вам нужно заполнить базу данных данными как часть процесса развертывания, например, в вашем случае вы можете развертывать функцию, для работы которой требуется, чтобы таблица данных была заполнена региональными данными, я бы посоветовал вам сделать это как часть процесса миграции:

class YourMigration extends Migration
{
    protected $regions = ['East Bay', 'South Bay'];

    public function up()
    {
        // Seed your region data here
        foreach ($this->regions as $name) {
            Region::create(['name' => $name]);
        }
    }
}

Самым большим преимуществом использования миграции перед сеялкой является то, что миграция предназначена для запуска только один раз. После миграции Laravel отслеживает уже выполненные миграции и не беспокоится о их повторении, поэтому вам не нужно беспокоиться о том, что данные окажутся там несколько раз. С другой стороны, сидер запускается каждый раз, когда вы запускаете php artisan db:seed, и обычно это то, что вы не настроили бы для запуска во время развертывания.

В конечном счете, я не думаю, что есть неправильный способ сделать это, и нет общепринятого стандартного подхода к этому, так что на самом деле это зависит от вас.

person Jonathon    schedule 29.07.2018