2017-10-18 102 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的文檔(它是什麼,如何使用等)。谷歌只是發現錯誤報告和單元測試討論。 –

相關問題