질문을 삭제하지 말아주세요.!
 
1
0
-1

안녕하세요. 

마이그레이션 연습한다고 이것저것 해보고 있는데 

todos 테이블을 만들고 칼럼을 추가하기 위해서 artisan make: 명령으로 생성 추가 롤백등을 해보다 이해가 안되는 부분이 있어 문의드립니다. 아래는 실제로 작업한 스텝입니다.

  1. 생성한 todos마이그레이션으로 테이블생성
  2. todos테이블에 컬럼을 추가하기 위한 마이그레이션 생성
    1. 컬럼 추가 마이그레이션 파일

      class AddColumnTodosTable extends Migration
      {
          public function up()
          {
              Schema::table('todos', function (Blueprint $table) {
                  $table->string('title');
              });
          }
      
          public function down()
          {
              Schema::table('todos', function (Blueprint $table) {
                  $table->drop('title');
              });
          }
      }
  3. 마이그레이션 실행하여 칼럼 정상추가 확인
  4. 롤백

롤백하여 칼럼추가 마이그레이션이 롤백됨을 확인하였는데 todos테이블이 사라졌습니다.

원인을 모르겠는데 down메소드가 잘 못 작성되었나요?

그리고 롤백이 바로전 마이그레이션이 아닌 그전 마이그레이션(todos테이블생성)이 실행되어 테이블이 지워진 것 같은데 (터미널보면 분명 롤백은 칼럼추가 마이그레이션이맞는데 왜 이러는지 모르겠습니다.. 아무튼) 이런 케이스에서 다시 마이그레이션 실행하면 todos테이블에 컬럼추가 마이그레이션이 실행되고 테이블이 존재하지 않는다는 에러가 뜹니다. 

마이그레이션이 꼬인 경우 같은데 이럴땐 어떻게 풀어줄 수 있을까요?

    CommentAdd your comment...

    2 answers

    1.  
      3
      2
      1

      컬럼을 삭제하는 메소드는 dropColumn() 인데 drop() 이라고 쓰셔서 테이블이 드롭된 것 입니다.


      현재 상황에서 푸는 방법은

      1. 첫번째 작성했던 마이그레이션(creat_todos_table.php)의 down() 메소드가 다음과 같이 작성되어 있는지 확인하고 같지 않으면 수정합니다.
      public function down()
      {
          Schema::dropIfExists('todos');
      }


          2. 롤백을 한 번 더 합니다. 

          3. add_column_todos_table.php 의 down()을 원래 목적한 대로 수정하고

          4. 마이그레이션을 수행합니다.

       


      1. 장재원

        create_todos_table.php에는 알려주신대로 작성이 되어있어 add_column_todos_table.php에 down만 dropColumn으로 수정한다음 롤백->마이그레이션 순으로 실행하여 잘 해결은 되었습니다.

        궁금한 부분이 있는데  위에 알려주신 "2. 롤백을 한번 더 합니다." 이 부분은 제가 처음 롤백을 1회 수행한 상태고(위 이미지에 보듯이 add_columen... 롤백되었음) 여기서 한 번 더하면 create_todos를 록백하므로 여기서 다시 마이그레이션을 해야 create_todos부터 마이그레이션을 실행하기 때문에 하신건가요?

        git revert와 비슷한 느낌인데 이게 맞는건지 궁금합니다 ^^;

      2. 이현석

        네 맞습니다. 테이블이 이미 지워진 상태이기 때문에 테이블을 생성하는 마이그레이션을 수행해야하므로 롤백을 한 단계 더 진행한 것입니다. 

      3. 장재원

        덕분에 잘 정리되었습니다.

        감사합니다 ^^

      CommentAdd your comment...
    2.  
      1
      0
      -1

      현석님 말씀대로 메서드를 잘못 사용하셨습니다.


      $table->drop('title');

      실험해 보지 않았습니다만, 이 명령으로 테이블이 삭제된다면 엄청난 버그인데요. 프레임워크에 PR을 보내고 본인의 이름을 박을 수 있는 절호의 기회입니다. 한 번 도전해보세요.

        CommentAdd your comment...