Ruby Coin

Rails 와 프론트 엔드 기술을 이용해 흥미 위주의 빠른 웹 개발 방법론

Pending Migration Error

데이터베이스 스키마 버젼이 다릅니다.
토픽 Ruby Coin > Development > Back-End > Ruby on rails 오류사전

데이터베이스 스키마 버젼이 다릅니다.

에러 메시지의 해석

db/schema.rb 파일을 살펴보면 버젼이 적혀있습니다.

ActiveRecord::Schema.define(version: 20140284052547) do

  # Your model definitions

end

SchemaMigration#version 에서의 버젼과 저 파일의 버전이 다를 경우 이 에러가 발생합니다. 혹은 마이그레이션이 제대로 되지 않았을 때 발생하게 됩니다.

의심해볼 수 있는 상황

마이그레이션이 아예 안된경우

 마이그레이션이 실패했을때, 혹은 마이그레이션을 하는 것을 잊어버리고 서버를 켰을 때 이런 일이 발생합니다.

rake db:migrate

다음 명령어를 실행해서  rake aborted!가 나타나지 않았다면 아마 제대로 실행될겁니다. 만약 rake aborted!가 뜬다면 아래 다른 해결책을 시도해보세요

db/migrate/... 에 있는 마이그레이션 파일 문법이 틀린경우

언제나 오타로 인한 버그를 주의해야 합니다. 파일이 다음 형식을 지켰는지 한번 살펴보세요

class CreatePosts < ActiveRecord::Migration
  def change
    create_table :posts do |t|
      t.string :content
      t.string :title

      t.timestamps null: false
    end
  end
end

제대로 수정을 했다면 데이터베이스 스키마를 새로 바꿔야 할 수 있습니다. 아래 해결책중 하나를 시도해보세요

해결책

DB안에 데이터가 없거나 중요하지 않은 경우

 간단합니다. 모든 데이터를 지우고, 마이그레이션을 다시 하면 됩니다.

rake db:drop

위 명령어로 DB를 날린후에

rake db:migrate

위 명령어로 마이그레이션을 시도하면 해결될 겁니다 

어떻게든 당장 서버를 실행시켜야 하는 경우 

그렇습니다. 가끔 우리는 다 필요없고 당장 서버를 실행시켜야 할만큼 급박한 상황이 생깁니다. 그때를 위한 땜빵! 임시방편입니다. 참고로 이 방식을 쓰면 DB의 스키마는 변하지 않지만, 당장 저 에러를 없앨 수 있습니다.

강제로 DB 버전과 스키마 버전을 일치시키면 당장의 저 에러 화면을 넘어갈 수는 있습니다.

 

db/schema.rb 파일을 열어보면 버젼이 적혀있습니다.

ActiveRecord::Schema.define(version: 20140284052547) do

  # Your model definitions

end

자 버전 보고 DB에 강제로 버젼을 덮어써서 컴퓨터가 오류가 있는지 인식을 못하게 합니다.

insert into schema_migrations (version) values ('20140284052547'); 

일단 이렇게 서버를 살려놓고 밑에 최후의 해결책을 시도해보세요 

DB 데이터를 살리면서 스키마를 변경하고자 하는 경우

가끔 우리는 모든 토끼를 잡고 싶을 때가 있습니다. 이미 서비스를 완성시켜놓고 그 테스트 서버가 아닌 실제 서비스 서버에다가 개발을 해버리는 짓을 할 때가 있습니다. 그럴때 데이터도 살리고 스키마도 바꾸어야 합니다.

이 항목에 대해서는 설명할 것이 너무 많아 공식 Rails 문서 링크를 남기겠습니다. 마이그레이션 파일로 스키마를 변경하려면 단순히 db/migrate/...안에 있는 파일을 바꾸고 마이그레이션을 시도해서는 안됩니다. 새로운 마이그레이션 파일을 만들어서 시도해야합니다.

댓글

댓글 본문