schema.rb를 잃어 버렸습니다! 재생성 할 수 있습니까?


133

일부 배포 문제로 인해 git에서 schema.rb 추적을 중지했습니다. 어쨌든 나는 이것을 schema.rb 파일이 사라지는 방식으로 채워 넣었습니다.

데이터베이스 또는 마이그레이션에서 schema.rb를 재생성하는 방법이 있습니까? 기존 데이터를 잃지 않기를 원합니다.

답변:


230

실행하면 rake -TRails 프로젝트에 가능한 모든 레이크 작업이 나열됩니다. 그중 하나가 db : schema : dump 이며 데이터베이스에서 Rails 앱의 schema.rb를 다시 만듭니다.

bundle exec rake db:schema:dump

고마워, 많은 답변이지만 당신이 처음 (그냥) 그렇게 보이는 것처럼 보입니다. 궁금한 점이 있다면 데이터베이스 자체 또는 마이그레이션에서 스키마를 생성합니까?
brad

7
데이터베이스 자체에서 마이그레이션 외부에서 발생한 변경 사항이있는 경우주의하십시오.
mguymon

1
schema.rb rake db:schema:dump는 레일 2.0 이후에도 여전히 빈 스키마를 포함합니다
Will Hardwick-Smith

위의 명령을 실행 한 후에도 schema.rb 파일이 동일하게 유지됩니다.
stevec

59

꼼꼼한,

rake db:schema:dump

현재 DB 스키마 덤프 DB를 FROM을 . 이는 마이그레이션을 변경 한 경우 IMO가 아닌 schema.rb 파일에 반영 되지 않음을 의미 합니다.

마이그레이션에서 스키마를 다시 작성하려면 다음을 수행하십시오.

rake db:drop  # ERASES THE DATABASE !!!! 
rake db:create
rake db:migrate

1
결과적으로 데이터 손실이 발생하여 OP는 피하고 싶다고 말했다. 또한 Colin이 지적한 것처럼 마이그레이션에서 순수하게 데이터베이스를 재생성하는 것은 이상한 종속성 문제 (일반적으로 말해서)가 발생할 가능성이 높기 때문에 매우 나쁜 생각입니다. 보류중인 마이그레이션이있는 경우 개발 시스템에서 마지막 마이그레이션을 실행 한 다음 rake db:schema:dump명령 을 실행하는 것이 가장 좋습니다 .
Paul Richter

4
모든 캔버스는 내 대답에 명확하게 설명되어 있습니다. schema : dump 만 실행하고 깨끗한 스키마를 얻지 못하여 정확하게 물었습니다. OP는 CVS에서 스키마 추적에 대해 이야기하고 있습니다. 내 스키마 내 정의 생산 DB하거나 이전 개발 DB에서 오래된 버전 내 마이그레이션 및하지 정렬하고 싶은
gamov

11
rake db:schema:dump

이것이 여전히 Rails 3에서 유효하다고 생각합니다-데이터베이스에서 schema.rb를 재생성합니다.


8

레일즈 5 웨이 :

rails db:schema:dump

또는 Gem :: LoadError가 발생하면 :

bundle exec rails db:schema:dump

노트 :

rails 5에서 rails대신에 를 사용하여 작업을 생성 / 실행하는 것이 좋습니다. 이는 rake단지 Rails 생성 된 작업이에서 확장 된 것을 기억하기위한 것 .rake입니다 lib/tasks/myTask.rake. 이 작업은 앞에 추가하여 실행할 수도 있습니다 rake.


5

schema.rb로컬로 재생성 하면 괜찮을 것입니다. 단순히 데이터베이스 테이블의 구조를 나타냅니다. 데이터 자체는이 파일에 포함되어 있지 않습니다.

schema.rb파일 을 재생성하려면 다음을 실행하십시오.

bundle exec rake db:schema:dump

그런 다음 단순히 새 schema.rb파일을 커밋하면 상태 가 좋아야합니다!


4

schema.rb 파일 자체에서 직접 :

다른 시스템에서 애플리케이션 데이터베이스를 작성해야하는 경우 db:schema:load모든 마이그레이션을 처음부터 실행하지 않고을 사용해야합니다 . 후자는 결함이 있고 지속 불가능한 접근 방식입니다 (이주가 많을수록 더 느리게 실행되며 문제가 발생할 가능성이 커짐).

따라서이 rake db:migrate글을 쓰는 시점에서 최저 등급의 답변으로 제안 된 의 제안을하지 마십시오 .


스키마를 재생성하기 전에 개발 시스템에 마이그레이션이있는 경우 마지막 몇 개의 보류중인 마이그레이션을 실행하려고하지만 마이그레이션에서 순수하게 데이터베이스를 재생성하는 것은 특히 나쁜 생각입니다. 특히 데이터가 유실 될 수 있기 때문입니다.
Paul Richter

1

또한 마이그레이션을 삭제해도 이전 스키마가 새로 고쳐지지 않는 비슷한 문제가있었습니다.

그래서 내가 한 일은 데이터베이스의 기존 테이블을 모두 삭제하고 다시 마이그레이션하는 것이 었습니다. 그런 다음 "db : schema : load"명령을 실행하면 새로운 schema.rb가 나옵니다.

drop table my_table_name // deleted them individually
rake db:migrate
rake db:schema:dump // re-created a new schema
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.