rake db : schema : load와 마이그레이션


171

여기에서 매우 간단한 질문-앱이 복잡해져 마이그레이션이 느리고 번거로울 수 있고 rake db:schema:load대신 더 많은 호출이 필요한 경우 마이그레이션이 왜 존재합니까?

위의 대답이 마이그레이션이 버전 제어 (데이터베이스 변경에 대한 단계별 기록)에 사용되는 경우 앱이 더 복잡해지고 더 많이 rake db:schema:load사용됨에 따라 기본 기능을 계속 유지합니까?


주의:

이 질문에 대한 답변에서 : 프로덕션 서버의 rake db:schema:load 데이터삭제 하므로 사용할 때주의하십시오.


5
+1 나는 이주의 목적을 결코 이해하지 못했다. 왜 버전 관리 스키마가 아닌가?
대안

5
@alternative-마이그레이션을 사용하면 null이 아닌 열을 추가 해야하는 경우 기본값을 사용하는 대신 해당 열을 데이터로 스마트하게 채울 수 있습니다.
Josh M.

답변:


208

마이그레이션은 데이터베이스에 대한 앞뒤 단계 변경을 제공합니다. 프로덕션 환경에서는 배포 중에 데이터베이스를 증분 적으로 변경해야합니다. 마이그레이션은이 기능에 롤백 페일 세이프를 제공합니다. rake db:schema:load프로덕션 서버에서 실행 하면 모든 프로덕션 데이터가 삭제됩니다. 이것은 위험한 습관입니다.

그러나 이민을 때때로 "붕괴"하는 것이 바람직한 관행이라고 생각합니다. 이를 위해서는 이전 마이그레이션을 삭제 schema.rb하고 파일 과 매우 유사한 단일 마이그레이션 schema_migrations으로 바꾸고이 변경 사항을 반영 하도록 테이블을 업데이트해야 합니다. 이 작업을 수행 할 때 매우주의하십시오! 조심하지 않으면 생산 데이터를 쉽게 삭제할 수 있습니다.

부수적으로, 나는 당신이 마이그레이션 파일에 데이터 생성을 두어서는 안된다는 것을 강력하게 믿는다. 이 seed.rb파일 또는 사용자 정의 레이크 또는 배포 작업에 파일을 사용할 수 있습니다. 이를 마이그레이션 파일에 넣으면 데이터베이스 스키마 스펙과 데이터 스펙이 혼합되어 마이그레이션 파일을 실행할 때 충돌이 발생할 수 있습니다.


80
rake db : schema : load가 모든 생산 데이터를 삭제한다는 것을 알려 주셔서 감사합니다!
Magne

2
"축소 된"마이그레이션을 스키마를 모방 한 새로운 마이그레이션으로 교체하는 대신,이를 정리 하고 새로 설치에 대해 db:schema:load실행하려고하면 사용자에게 프롬프트를 표시하는 gem을 작성했습니다 db:migrate. @ clear_migrations
Yarin

명백한 대답이지만 프로덕션으로 처음 푸시하기 전에 모든 마이그레이션을 삭제하고 db.schema를 첫 번째 마이그레이션으로 사용하는 것이 좋습니다.
dtc

30

방금 전에이 게시물을 우연히 만났으며 예상했던 대답을 보지 못했습니다.

rake db:schema:load시스템을 처음으로 프로덕션 환경에 배치 할 때 좋습니다. 그런 다음 정상적으로 마이그레이션을 실행해야합니다.

또한 스키마는 마이그레이션을 정리할 때에도 다른 시스템을 프로덕션에 배치 할 수있는 모든 정보를 제공하므로 원하는 때마다 마이그레이션을 정리하는 데 도움이됩니다.


따라서 마이그레이션을 사용할 필요가 없기 때문에 마이그레이션을 "정화"할 수 있습니까? 기괴한 말처럼 들립니다.
Abe Petrillo

db:schema:load개발주기 전체에서 몇 초 동안 한 번만 면도하는 것 이외 의 이점이 무엇인지 분명하지 않습니다 . 빌드하는 데 30 초 이상 걸리는 앱으로 작업 한 적이 있습니까? 현재 마이그레이션 파일에 버그가있는 앱을 개발 중이며 버그 수정이나 실행 없이는 절대 마이그레이션되지 않으므로 db:schema:loadschema : load는 앱 개발과 관련하여 문제가 발생했을 때입니다.
Ninjaxor

마이그레이션을 유지하기위한 또 다른 주장은 Rails 핵심 팀이 사용자에게를 지시한다는 것 instead of editing schema.rb, please use the migrations feature입니다. 따라서 db:schema:load자동 생성 된 파일에서 실행 하여 다시 자동 생성하기위한 마이그레이션이없는 경우 스키마를 수동으로 "편집"하고 마이그레이션을 비활성화하는 경로를 효과적으로 사용하게됩니다. 나는 이것에 대한 레일 가이드에서 인용하기를 원하지만 schema : load 기능에 접근하는 방법을 결정하는 데 어려움을 겪는 schema : load에 대해서는 논의하지 않습니다. = /
Ninjaxor

나는 이에 동의하기 때문에이 페이지에 정확하게 왔습니다. 내 경험에 따르면 사이트가 프로덕션 환경에 있으면 마이그레이션을 사용하여 사이트를 변경하는 것이 훨씬 안전합니다. 그럼에도 불구하고 db / schema.rb의 시작에 대한 의견은 그 반대를 정확하게 진술합니다! (.gitignore에 db / schema.rb를 넣는 것을 잊었 기 때문에 모든 프로젝트를 시작할 때 문제가 발생합니다 ...)
user1251840

@AbePetrillo 와우 나는이 의견을 완전히 놓쳤다. 물론, 내가 의미하는 바는 원하는 경우 모든 프로덕션 시스템에서 실행 된 이전 마이그레이션을 정리할 수 있다는 것 입니다. 수년에 걸쳐 나는 항상 그것들을 유지했지만 "내가 원할 때마다 이주 청소를 돕는다"라는 말은 "이주를 사용할 필요가 없다"는 의미는 아니었다. 따라서 새 머신을 배포 할 rake db:schema:load때는와 반대로 실행하십시오 rake db:migrate. 그런 다음부터 할 수 있습니다 rake db:migrate.
ereslibre

9

마이그레이션을 통해 DB에 데이터를 추가 할 수도 있습니다. 그러나 db : schema : load는 스키마 만로드합니다.


6

마이그레이션을 롤백 할 수 있으며 추가 기능을 제공합니다. 예를 들어 스키마 변경의 일부로 일부 데이터를 수정해야하는 경우 마이그레이션으로 수행해야합니다.


4

다른 ORM 사용자는 Rails에 '동기화 및 업데이트'기능이 없다는 것이 항상 이상해 보였습니다. 즉, 전체 최신 스키마를 나타내는 스키마 파일을 사용하여 기존 DB 구조를 살펴보고 필요에 따라 테이블, 열, 인덱스를 추가 / 제거합니다.

나에게 이것은 조금 더 느리더라도 훨씬 더 강력 할 것입니다.


1
하나의 복잡한 스키마에서 다른 스키마로 데이터가있는 데이터베이스를 마이그레이션하는 작업은 때때로 쉽지 않습니다. 자동으로 해결되지 않고 단일 단계로 데이터가 일관되게 마이그레이션되지 않을 수 있습니다. Rails 마이그레이션은 마스터이며 스키마는 종속적입니다. 각 마이그레이션마다 스키마가 자동으로 다시 작성되지만 그 반대의 경우는 아닙니다.
oklas

Rails 자체 가이드 schema는 마이그레이션이 아니라 마스터 임을 명시 적으로 설명 합니다.
Drenmi

0

이미 주석으로 게시했지만 db / schema.rb 파일의 주석을 여기에 넣는 것이 좋습니다.

# Note that this schema.rb definition is the authoritative source for your
# database schema. If you need to create the application database on another
# system, you should be using db:schema:load, not running all the migrations
# from scratch. The latter is a flawed and unsustainable approach (the more migrations
# you'll amass, the slower it'll run and the greater likelihood for issues).
#
# It's strongly recommended that you check this file into your version control system.

실제로, 내 경험은 schema.rb 파일이 아닌 git에 마이그레이션 파일을 넣는 것이 좋습니다 ...


0

rake db:migrate데이터베이스에서 테이블을 설정하십시오. 마이그레이션 명령을 실행하면 db / migrate /에서 루비 파일을 찾아 가장 오래된 파일부터 실행합니다. 각 마이그레이션 파일 이름의 시작 부분에 타임 스탬프가 있습니다.

이와 달리 rake db:migrate아직 실행되지 않은 마이그레이션을 실행 rake db:schema:load하면 이미 생성 된 스키마를 db/schema.rb데이터베이스 에로드 합니다.

레이크 데이터베이스 명령 에 대한 자세한 내용은 여기를 참조하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.