我发现,在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');
});
无论如何,如果我运行该迁移,表创建得很好,但是外键失败并且我收到错误。没关系。我应该得到一个错误。但是,常识让我假设如下:
好的,所以
我在这里做错了吗?我弄清楚如何“撤消”失败的迁移的唯一方法是实际进入数据库并删除表。在处理复杂的架构时,这是非常令人沮丧的,我会来回修复错误。
所以,我想我现在已经有了我的小咆哮,我的问题是:
如何回滚引发错误的迁移?
答案 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可以回滚。
为了使其正常运行,需要有一个等效的“删除”脚本,该脚本在发生错误时运行以还原架构更改