Rails : 마이그레이션 파일을 업데이트 한 다음 DB를 실행합니다 : 마이그레이션이지만 스키마가 업데이트되지 않습니다.
-
06-07-2019 - |
문제
테이블 중 하나에 추가 필드를 추가하려고합니다.
마이그레이션 파일 (DB Migrate 아래)에 필드를 추가 한 다음 문제없이 실행되는 'Rake DB : Migrate'를 실행했습니다. 내 텍스트 편집기는 심지어 내 schema.db 파일이 업데이트되었으며 새로 고침해야한다고 말했습니다.
스키마 파일에는 새 필드가 포함되어 있지 않으며 내 뷰에서 필드를 참조하려는 시도는 비참하게 실패합니다.
어떻게해야합니까? 데이터베이스를 완전히 삭제하고 다시 재현하지 않고도 레일을 통해 추가 필드로 테이블을 업데이트 할 수 있습니까?
해결책
http://guides.rubyonrails.org/migrations.html#changing-veristing-migrations
때때로 당신은 마이그레이션을 쓸 때 실수를 할 것입니다. 이미 마이그레이션을 실행 한 경우 마이그레이션을 편집하고 마이그레이션을 다시 실행할 수는 없습니다. Rails는 이미 마이그레이션을 실행했다고 생각하며 레이크 DB : 마이그레이션을 실행할 때 아무것도하지 않을 것입니다. 마이그레이션을 롤백해야합니다 (예 :
rake db:rollback
), 마이그레이션을 편집 한 다음 실행하십시오rake db:migrate
수정 된 버전을 실행합니다.
다른 팁
데이터베이스에서 무언가를 추가/변경할 때 항상 새 마이그레이션 파일을 작성해야합니다. 이것이 마이그레이션의 목적입니다. 마이그레이션 파일은 새로운 변경을 수행하고 변경을 취소 할 수 있어야합니다. 이런 식으로 무언가 잘못되거나 마음을 바꾸면 이전 마이그레이션으로 쉽게 롤백 할 수 있습니다.
다음 링크의 섹션은 '마이그레이션의 해부학'과 '마이그레이션 쓰기'라는 표시가 도움이 될 수 있습니다.
내 자신의 질문을 해결했습니다 ..
기본적으로 스캐 폴딩을 실행할 때 생성 된 원래 마이그레이션 파일을 편집하기보다는 달성하려는 것만으로 새 마이그레이션 파일을 만듭니다.
http://guides.rubyonrails.org/migrations.html#creating-a-standalone-migration
나는 똑같은 일을했는데 필드 이름을 변경하고 싶었습니다.
class CreateComments < ActiveRecord::Migration
def change
create_table :comments do |t|
t.string :commenter
t.text :body
# this line adds an integer column called `article_id`.
t.references :article, index: true
t.timestamps
end
end
end
나는 바뀌었다
t.text :body
에게
t.text :comment_body
나는 레이크를 시도했다
db:migrate
출력없이 다시 명령 프롬프트에 들어간 것처럼 아무 일도 일어나지 않았습니다 ... 나는 스택 오버플로를 보았고 이것 나에게 레이크를 안내했다
db:migrate:redo
풋 풋으로
== 20141129044056 CreateComments: reverting ===================================
-- drop_table(:comments)
-> 0.0000s
== 20141129044056 CreateComments: reverted (0.0886s) ==========================
== 20141129044056 CreateComments: migrating ===================================
-- create_table(:comments)
-> 0.0040s
== 20141129044056 CreateComments: migrated (0.0040s) ==========================
그런 다음 신체 대신 Commenter_Body로 페이지/컨트롤러를로드하여 완벽하게로드했습니다.
나는 이것이 또한 같은 해결책이라고 생각합니다. 모델/DB의 아래 작업에 어떤 문제가 있는지 모르겠습니다 (저는 여전히 ROR에 아주 새롭습니다. 실제로 제 3 일은 ...)
실행하여 후자의 마이그레이션으로 스키마를 재생할 수있었습니다. rake db:schema:dump
이것이 적용되는지 모르겠지만, 샷의 가치가 있습니다. 바로 "레일을 사용한 애자일 개발, 제 3 판":
때로는이 schema_migrations 테이블이 문제를 일으킬 수 있습니다. 예를 들어 마이그레이션 소스 파일을 생성하고 실행하는 경우 db:migrate
파일에 스키마 정의 문을 추가하기 전에 데이터베이스는 업데이트되었다고 생각하며 스키마 정보 테이블에는 새 버전 번호가 포함됩니다.
그런 다음 기존 마이그레이션 파일을 편집하고 실행하는 경우 db:migrate
다시, Rails는 새로운 변경 사항을 적용하는 것을 알지 못합니다. 이러한 상황에서는 종종 데이터베이스를 삭제하고 다시 만들어주고 마이그레이션을 다시 실행하는 것이 가장 쉽습니다.
일단 이동하면 DB : 마이그레이션을 다시 한 번 마이그레이션 한 다음 해당 파일에 열을 추가 할 수 없습니다. Rails g Migration add_columnname_to_tablename을 사용하여 해당 열을 추가하고 DB를 사용할 수 있도록 새 마이그레이션 파일을 생성해야합니다.