Laravel 5-将MySQL数据从Dev传输到暂存/生产

时间:2018-07-29 00:02:51

标签: mysql laravel laravel-5 seeding

我有一个问题,就是我已经挠头好几个小时了... 我已经构建了一个Laravel 5.4应用,可以在分阶段进行测试。我能够创建数据库并运行迁移。因此,问题是如何将数据从Dev传输到Staging,再传输到Production?

我有一个名为“ regions”的表,该表列出了该地区的所有区域,例如“ San Francisco”,“ East Bay”,“ South Bay”等。我知道可以解决类似导入sql文件或Laravel Seeding的问题,但是我只想知道执行此操作的正确方法。

先谢谢了。

1 个答案:

答案 0 :(得分: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时,种子机都会运行,通常情况下,您不会将其设置为在部署期间运行。

最终,我认为没有错误的方法,也没有公认的标准方法,所以这完全取决于您