2017-10-18 84 views
1

如果由于某种原因(例如,错字)中途迁移失败,它会提交一半的迁移,并将其余部分退出。它似乎没有尝试回滚它所做的事情(通过回滚一个包含事务或调用())laravel migrations离开数据库处于无效状态

如果您尝试手动回滚上次迁移, “php artisan migrate:rollback --step = 1”,它只回退上次之前的迁移,即在失败之前的回滚。如果客户的插入失败

公共功能了()

{ 
    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(); 

(例如,我们忘了设置非空列,一个错字,或存在记录时:

考虑这个迁移它不应该),插入地址记录WAS。

迁移:回滚不回滚此迁移,它回滚之前,我们留下一个虚假的孤儿地址记录。显然,我们可以删除重新创建数据库并从头开始迁移,但那不是重点 - 迁移不应该让迁移完成的一半和数据库处于无效状态。

有没有解决方案?例如是否可以在迁移中放入交易,以便插入全部或全部?

如果我们在完成一半的迁移失败后查看迁移表,则不存在。

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

+0

我我从未尝试添加交易,但它可能有效。我可能不得不在下一次尝试,而不是在进行回滚/迁移时不断地注释行。 – aynber

回答

2

您应该运行在一个事务中这些迁移:

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

,或者你可以使用try/catch块:

try { 
    DB::beginTransaction(); 

    // Your code goes here ... 

    DB::commit(); 
} catch(\Exception $e) { 
    DB::rollBack(); 
} 
+0

辉煌,这工作。我在主代码中使用了两种形式的事务,但迁移数据库语法与雄辩文档完全不同,这一直是一个谜 - 我们只能通过网上的例子和/或猜测来综合它。 –

+0

另外我相信你可以通过在你的迁移中导入'DatabaseMigrations'特性来完成我在评论中提到的内容。 –

+0

嗨,你知道我在哪里可以找到有关DatabaseMigrations trait的文档(它是什么,如何使用等)。谷歌只是发现错误报告和单元测试讨论。 –

相关问题