개발 단계에서는 테이블 생성하는 마이그레이션을 고쳐가며 작업해도 괜찮습니다. 하지만 이미 애플리케이션을 배포한 뒤라면 그럴 수 없죠. 기존 테이블을 수정하는 마이그레이션을 작성해야 합니다.
오늘은 기존 테이블을 변하는 마이그레이션을 작성하다가 겪은 일을 공유하고자 합니다.
아래와 같이 아주 간단한 마이그레이션을 작성했습니다.
public function up()
{
Schema::table('posts', function(Blueprint $table) {
$table->renameColumn('movie_id', 'postable_id');
$table->string('postable_type')->default('');
});
}
posts
테이블에서 movie_id
컬럼명을 postable_id
로 바꾸고, postable_type
컬럼을 하나 추가하는 것입니다.
개발 환경에서는 마이그레이션이 문제 없이 실행되었는데, 테스트를 돌려보니 에러가 납니다. 에러 메시지를 보니 postable_type
컬럼이 없다고 합니다.
table posts has no column named postable_type
분명히 개발 환경에서 마이그레이션할 때 문제가 없었는데 어떻게 된 일일까요?
문제는 SQLite 때문이었습니다. 저는 테스트 속도를 높이기 위해 테스트시에는 SQLite를 쓰고 있습니다. 근데, SQLite는 테이블을 수정할 때 한 번에 여러 컬럼을 추가할 수가 없다고 하네요. 그래서 테스트 환경에서는 두번째 작업인 postable_type
컬럼 추가가 진행이 안된 것입니다.
해결 방법은 간단합니다. 수정하는 마이그레이션인 경우 한 번에 하나씩만 바꾸도록 코드를 바꿔주면 됩니다.
public function up()
{
Schema::table('posts', function(Blueprint $table) {
$table->renameColumn('movie_id', 'postable_id');
});
Schema::table('posts', function(Blueprint $table) {
$table->string('postable_type')->default('');
});
}
물론 테스트 할 때 SQLite 안쓰시는 분은 신경쓰지 않으셔도 됩니다.