laravel migrations使DB处于无效状态

时间:2017-10-18 15:19:05

标签: php laravel migration

如果迁移由于任何原因(例如错字)中途失败,则会提交一半迁移,并将其余部分留下。它似乎并没有尝试回滚它刚刚做的事情。(通过回滚包含的事务,或者调用down())

如果您尝试手动回滚上次迁移,例如php artisan migrate:rollback --step=1,它仅回滚最后一次的迁移,即失败前的迁移。

考虑这种迁移:

public function up()
{
    DB::table('address')->insert(['id'=>1,'street'=>'Demo', 'country_id'=>83]);
    DB::table('customer')->insert(['id'=>1,'username'=>'demo','address_id'=>1]);
}

public function down()
{
    DB::table('customer')->where('id',1)->delete();
    DB::table('address')->where('id',1)->delete();
}

如果客户的插入失败(例如,我们忘记设置非空列,输入错误或记录时不应该),则插入地址记录WAS。

migrate:rollback不会回滚此迁移,它会回滚之前的版本,而我们会留下虚假的孤立地址记录。显然,我们可以删除重新创建数据库并从头开始运行迁移,但这不是重点 - 迁移不应该使迁移的一半完成并且数据库处于无效状态。

有解决方案吗?例如可以在迁移中放置事务,以便插入全部或全部内容吗?

如果我们在迁移失败的一半之后查看迁移表,那么它就不存在了。

注意:我们使用迁移来插入(和修改/删除)应用程序运行所需的静态数据。它不是开发数据或测试数据。例如。国家数据,货币数据以及管理员运营商等。

1 个答案:

答案 0 :(得分:2)

您应该在事务中运行这些迁移:

DB::transaction(function () {
    // Your code goes here.
}

或者您可以使用try / catch块:

try {
    DB::beginTransaction();

     // Your code goes here ...

    DB::commit();
} catch(\Exception $e) {
    DB::rollBack();
}