导致错误的Laravel Migrations不会回滚

时间:2014-10-11 02:48:28

标签: database laravel-4

我发现,在Laravel中构建我的数据库模式时,失败的迁移不会回滚,这会使迁移变得毫无意义。

例如,我有这个迁移:

Schema::create('accounts', function(Blueprint $table)
{
    $table->increments('act_id');

    $table->string('act_name', 50)->unique();
    $table->boolean('act_active')->default(1);
    $table->unsignedInteger('act_type');
    $table->unsignedInteger('act_businesstype')->default(1);

    $table->timestamps();
});

Schema::table('accounts', function($table)
{
    $table->foreign('act_businesstype')->references('bst_id')->on('businesstypes');
});

无论如何,如果我运行该迁移,表创建得很好,但是外键失败并且我收到错误。没关系。我应该得到一个错误。但是,常识让我假设如下:

  1. 由于迁移失败,更改应自动回滚。好吧,他们没有。
  2. 好的,所以

    1. 我应该调用migrate:rollback来撤消这些更改。好吧,没有发生迁移的记录,所以我最终还是回滚了之前发生的迁移。
    2. 我在这里做错了吗?我弄清楚如何“撤消”失败的迁移的唯一方法是实际进入数据库并删除表。在处理复杂的架构时,这是非常令人沮丧的,我会来回修复错误。

      所以,我想我现在已经有了我的小咆哮,我的问题是:

      如何回滚引发错误的迁移?

2 个答案:

答案 0 :(得分:3)

一种解决方案是从事务中执行迁移,以便在迁移中期发生错误时,不会提交任何内容,并且会回滚整个事务。安东尼奥·卡洛斯·里贝罗(Antonio Carlos Ribeiro)写了一个很好的课程,整齐地处理这个过请参阅his description of the process here以及finished migration class on GitHub

安装完课程后,请创建迁移,以便他们扩展新的迁移课程,并调用migrateUp()migrateDown()代替up()down()

class CreateAccountsTable extends PragmaRX\Support\Migration {

    protected function migrateUp()
    ...

...并且不必再次手动修复拙劣的迁移!

答案 1 :(得分:0)

几年后回到这个问题,并且进一步了解数据库的工作原理:

无法迁移到“自动回滚”。无法在事务中执行架构更改。只有INSERTS,UPDATES和DELETES可以回滚。

为了使其正常运行,需要有一个等效的“删除”脚本,该脚本在发生错误时运行以还原架构更改