代码之家  ›  专栏  ›  技术社区  ›  John Little

laravel迁移使数据库处于无效状态

  •  1
  • John Little  · 技术社区  · 8 年前

    如果一个迁移由于任何原因(例如拼写错误)中途失败,它将提交一半的迁移,其余的则不做。它似乎并没有试图倒退它刚刚做的事情。(通过回滚包含的事务或调用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();
    }
    

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

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

    有解决方案吗?e、 g.是否可以将事务放入迁移中,使其全部插入或不插入?

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

    1 回复  |  直到 7 年前
        1
  •  3
  •   Raza Mehdi    8 年前

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

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

    或者可以使用try/catch块:

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