gpt4 book ai didi

database - 导致错误的 Laravel 迁移不会回滚

转载 作者:太空狗 更新时间:2023-10-30 01:49:34 26 4
gpt4 key购买 nike

我发现,在 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 来撤消这些更改。好吧,没有发生迁移的记录,所以我最终回滚了之前发生的迁移。

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

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

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

最佳答案

一种解决方案是从事务内执行迁移,这样如果在迁移过程中发生错误,则不会提交任何内容,并且会回滚整个事务。 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()
...

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

关于database - 导致错误的 Laravel 迁移不会回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26310531/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com