首页 文章

laravel migrations使DB处于无效状态

提问于
浏览
1

如果迁移由于任何原因(例如错字)中途失败,则它将迁移一半,并将其余部分留下 . 它似乎没有尝试回滚它刚刚做的事情 . (通过回滚包含事务或调用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 回答

  • 2

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

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

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

    try {
        DB::beginTransaction();
    
         // Your code goes here ...
    
        DB::commit();
    } catch(\Exception $e) {
        DB::rollBack();
    }
    

相关问题