2017-10-18 5 views
1

어떤 이유로 든 마이그레이션이 실패한 경우 (예 : 오타) 마이그레이션의 절반을 커미트하고 나머지는 그대로 둡니다. 방금 수행 한 작업을 롤백하려고 시도하지 않는 것입니다 (포괄적 인 트랜잭션을 롤백하거나 아래로 호출하여)laravel 마이그레이션으로 인해 DB가 유효하지 않은 상태가됩니다.

마지막으로 이전 롤백을 수동으로 시도하는 경우 "php artisan migrate : rollback --step = 1", 마지막으로 이동하기 전의 롤백 즉, 실패 이전 롤백 만 롤백합니다. 고객의 삽입이 실패하면 우리가 null 이외의 열, 오타를 설정하는 것을 잊었다 예 (

공공 기능까지()

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

또는 기록 할 때 존재합니다

이 마이그레이션을 고려 그것은 없어야 함), 주소 레코드가 삽입되었습니다.

migrate : 롤백은이 마이그레이션을 롤백하지 않으며, 이전 롤백을 롤백하고, 고아없는 고아 주소 레코드가 남습니다. 분명히 우리는 데이터베이스를 다시 만들지 않고 처음부터 마이그레이션을 실행할 수 있습니다.하지만 마이그레이션은 절반 정도의 마이그레이션을 완료하고 DB를 유효하지 않은 상태로 남겨 두지 않아야합니다.

해결책이 있습니까? 예 : 하나 또는 둘 모두를 삽입 할 수 있도록 마이그레이션에 트랜잭션을 넣을 수 있습니까?

반부 완료 마이그레이션이 실패한 후 마이 그 레이션 테이블을 보면 거기에없는 것입니다.

참고 : 우리는 마이그레이션을 사용하여 응용 프로그램이 실행해야하는 정적 데이터를 삽입 (및 수정/삭제)합니다. dev 데이터 또는 테스트 데이터가 아닙니다. 예 : 국가 데이터, 통화 데이터뿐만 아니라 관리 운영 등

당신은 트랜잭션 내부의 이러한 마이그레이션을 실행해야
+0

I을 트랜잭션을 추가하지 않았지만 작동 할 수 있습니다. 롤백/마이그레이션을 수행 할 때 끊임없이 라인을 주석 처리하는 대신 다음 번에 시도해야 할 수도 있습니다. – 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

훌륭합니다. 주 코드에서 두 가지 형태의 트랜잭션을 모두 사용하지만, 웅변적인 문서와는 완전히 다른 이주 DB 구문은 신비한 것이 었습니다. 우리는 웹이나 추측의 예에서 합성 할 수있었습니다. –

+0

또한 내 의견에 언급 된 내용을 마이그레이션 내에서 'DatabaseMigrations'특성을 가져 와서 수행 할 수 있다고 생각합니다. –

+0

안녕하세요, DatabaseMigrations 특성 (사용법, 사용법 등)에 대한 문서를 어디서 찾을 수 있는지 알고 계십니까? Google은 버그 보고서와 단위 테스트 토론을 찾고 있습니다. –