2011-06-12 4 views
2

루비 온 레일즈에서 마이그레이션을 이해하는데 약간의 문제가 있습니다. 나는 (별도의 파일에 저장) 내 응용 프로그램의 db\migrate\ 디렉토리에 다음과 같은 두 가지 종류가 있습니다레일즈 - 이해 db : 마이 그 레이션

class CreateUsers < ActiveRecord::Migration 
    def self.up 
    create_table :users do |t| 
     t.string :name 
     t.string :email 

     t.timestamps 
    end 
    end 

    def self.down 
    drop_table :users 
    end 
end 

class AddEmailUniquenessIndex < ActiveRecord::Migration 
    def self.up 
    add_index :users, :email, :unique => true 
    end 

    def self.down 
    remove_index :users, :email 
    end 
end 

나는이 두 파일을 함께 실행하는 것 방법에 대해 혼란 스러워요. 이 두 번째 클래스를 만들었을 때 Michael Hartl의 책은 "사용자 테이블의 마이그레이션 파일을 편집 할 수는 있지만 롤백을 수행 한 다음 다시 마이그레이션해야합니다. 레일스 웨이는 데이터가 발견 될 때마다 마이그레이션을 사용합니다 모델을 바꿀 필요가 있습니다. " 이 마이그레이션은 실제로 어떻게 작동합니까? 데이터베이스가 마이그레이션 될 때 디렉토리의 모든 파일이 실행됩니까? 장면 뒤에서 무슨 일이 벌어지고 있나?

답변

7

규칙에 따라 이러한 마이그레이션 클래스의 파일 이름 앞에는 타임 스탬프 생성 날짜 표시 (예 : 20110611000000). db : migrate를 실행하면 레일스는 데이터베이스에 마지막으로 적용된 마이그레이션의 타임 스탬프가 포함 된 데이터베이스의 특수 테이블을 검사합니다. 그런 다음 해당 날짜 이후의 모든 타임 스탬프와 함께 모든 마이그레이션을 적용하고 데이터베이스 테이블을 마지막 마이그레이션의 타임 스탬프로 업데이트합니다. 결과적으로 각 이주 클래스는 정확히 한 번 데이터베이스에 적용됩니다.

마이클 하트 (Michael Hart)는 모든 마이그레이션을 하나의 파일에 넣으면 레일즈가 적용된 마이그레이션과 적용되지 않은 마이그레이션을 구분할 수 없다는 것을 보여주었습니다. 그 시점에서 유일한 옵션은 데이터베이스의 모든 테이블을 삭제하고 처음부터 모든 마이그레이션을 실행하는 것입니다. 기능적으로는 효과가 있지만 모든 데이터가 손실됩니다. 처음으로 돌아가는 것보다 '앞으로'방향으로 만 이동 한 다음 다시 앞으로 이동하는 것이 좋습니다.

+4

'db : migrate를 실행하면 레일스는 데이터베이스에 마지막으로 적용된 마이그레이션의 타임 스탬프가 포함 된 데이터베이스의 특수 테이블을 검사합니다 .' 테이블 이름은'schema_migrations'이며 이미 실행 된 마이그레이션 파일의 타임 스탬프를 저장합니다. – rubyprince

2

기본적으로 프로그래밍 방식의 SQL 인터페이스 프런트 엔드입니다. 따라서 데이터베이스와 직접 상호 작용할 필요가 없도록하고 모든 데이터베이스 유형 (예 : mySQL, SQLite, PostOgre)을 사용할 수 있는지 확인하십시오.

4

이러한 마이그레이션은 실제로 어떻게 작동합니까?

db : migrate는 레이크 작업입니다. db : migrate 태스크 (빌트인 Rails 지원 프로그램)는 프로젝트의 db/migrate 디렉토리를 검색하여 거기에있는 파일을 사용하여 데이터베이스의 스키마를 업데이트합니다.

데이터베이스를 마이그레이션 할 때 디렉토리의 모든 파일이 실행됩니까? 아니요. 새 db/migrate 파일 (db : migrate 명령을 마지막으로 실행 한 이후에 추가 한 파일) 만 명령 줄에 "rake db : migrate"를 입력하면 실행됩니다.

즉, DB/마이그레이션 파일을 수정하는 것은 좋지 않은 방법입니다 (Rails 방식이 아님). 대신 새 파일을 추가하십시오.

여기 뒤에서 무슨 일이 벌어지는가? Rails와 db : migrate 기계가 프로젝트의 db 버전을 추적하는 방법은 Rails의 버전에 따라 다릅니다.

추가 : 다음은 커버에서 마이그레이션이 작동하는 방법에 대한 설명입니다. good info입니다.

3

각 파일을 한 번 실행할 명령 집합으로 생각하십시오. 기본적으로 rake db : migrate 작업은 마이그레이션 객체를로드하고 .up()을 실행합니다. 이미 이전을 실행 한 경우 파일을 변경해도 더 이상 영향을주지 않습니다. 마이그레이션이 이미 실행되었습니다. 그러나 마이그레이션을 변경하면 다른 사용자가 귀하의 앱을 버리게됩니다.따라서 이전 마이그레이션은 변경하지 말고 새 마이그레이션을 만든 다음 한 번만 실행하십시오.

마이그레이션 클래스는 한 번만 실행하면 이전 마이그레이션 파일을 실제로 삭제할 수 있지만 원하는 경우 다시 실행할 수 있습니다. DB를 다시 설정하면 rake db : setup을 먼저 실행해야합니다. rake db : migrate 마이그레이션에는 데이터베이스를 최종 상태로 만드는 데 필요한 모든 단계가 더 이상 포함되지 않으므로 먼저 db를 schema.rb 파일에서로드해야합니다. 파일은 많은 공간을 차지하지 않으므로 일반적으로 파일을 혼자 두는 것이 더 간단합니다.

관련 문제