【问题标题】:Laravel Migrations that cause error don't rollback导致错误的 Laravel 迁移不会回滚
【发布时间】:2014-12-06 06:41:56
【问题描述】:

我发现,在 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. 由于迁移失败,更改应自动回滚。好吧,他们没有。

好的,那么

  1. 我应该调用 migrate:rollback 来撤消这些更改。好吧,没有发生迁移的记录,所以我最终回滚了之前发生的迁移。

我在这里做错了吗?我想出如何“撤消”失败迁移的唯一方法是实际进入数据库并删除表。在处理复杂的架构时,我要来回修复错误,这非常令人沮丧。

所以,我想现在我已经吐槽了,我的问题是:

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

【问题讨论】:

  • 这是一个绝妙的问题,肯定会让 Laravel 开发者睡不着觉。一年后仍然没有有效的解决方案,令人失望。
  • 同样我总是有这个问题,我必须进入数据库并手动删除表...... Laravel至少应该首先实现它!
  • 我通常会注释我的迁移,成功运行它,然后定期回滚以执行迁移文件的down 方法中的代码。我还使用本地数据库实例来测试我的迁移并在我处理太多更改时清除模式。只有这样我才真正开始在真实数据库上运行我的迁移。但你是对的,似乎没有任何方法可以使用提供的工具来做到这一点。

标签: database laravel-4


【解决方案1】:

多年后回到这个问题,并了解更多关于数据库现在如何工作的信息:

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

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

【讨论】:

    【解决方案2】:

    一种解决方案是从事务中执行迁移,这样如果在迁移过程中发生错误,则不会提交任何内容,并且整个事务都会回滚。 Antonio Carlos Ribeiro 写了一个很好的类来巧妙地处理这个过程。参见his description of the process herefinished migration class on GitHub

    安装他的类后,创建迁移以扩展新的 Migration 类,并调用 migrateUp()migrateDown() 代替 up()down()

    class CreateAccountsTable extends PragmaRX\Support\Migration {
    
        protected function migrateUp()
        ...
    

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

    【讨论】:

    • 我终于开始尝试这个解决方案了。我实现了这个类,它似乎没有做任何事情。即使 migrate 调用产生错误,成功创建的表也会留在数据库中,并将迁移添加到迁移表中。所以,我必须删除它以及从迁移中创建的所有表以“回滚”。
    猜你喜欢
    • 2017-03-08
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 2017-04-18
    • 2021-07-01
    • 2017-05-10
    • 2017-07-31
    • 1970-01-01
    相关资源
    最近更新 更多