외래 키 작성 시 주의사항
테마「데이터베이스 이니셜은 대문자인가 소문자인가」
이 게시물은 Rails 데이터베이스 작성에 관한 기사입니다.
데이터베이스 주변은 실수하면 나중에 앱 개발에 나쁜 영향을 미칩니다.
이 실수를 참고로 여러분은 가능한 한 데이터베이스 주변에서는 틀리지 않도록 해 주세요!
이번 주범
외래 키의 머리글자를 대문자로 해 버렸기 때문에, seed.rb로부터 데이터를 입력할 수 없게 되었다.
실물은 이쪽입니다. Faculity_id← 이것. . . 본래는 faculity_id가 되어야 한다
scheme.rb
create_table "majors", force: :cascade do |t|
t.index ["Faculity_id"], name: "index_majors_on_faculity_id"
end
실수의 원인
한 달 만에 레일을 만져 프레임 워크를 사용하는 것을 잊어 버렸습니다
(초보자는 매일 만지지 않으면 안 되네요. 생각해 봤어요 😢)
터미널에서 입력한 실수 명령
references의 앞을 대문자로 해 버렸기 때문에, 외래 키도 대문자가 되었다.
terminal.
$ rails g migration AddFaculityToMajors Faculity:references
원래 $ rails g migration Add (이니셜 대 컬럼 이름)
라는 명령의 구성입니다. (아래 명령이 정확합니다)
terminal.
$ rails g migration AddFaculityToMajors faculity:references
seed.rb에서 데이터를 입력하면. . .
seed.rb에서 데이터를 보낼 수 없습니다. 외래 키가 맞지 않기 때문에 당연히 당연하네요.
scheme.rb
create_table "majors", force: :cascade do |t|
t.index ["Faculity_id"], name: "index_majors_on_faculity_id"
end
이쪽은 소문자이므로, 키를 찾을 수 없고 rollback 되어 버렸다.
seed.rb
Major.create!(id: 1, name: '経営', faculity_id: 1)
여기 또 다른 문제가. . . Faculity_id(주범)가 사라지지 않는다
Faculity_id의 외래 키를 삭제하기 위해 삭제 명령을 시도했지만,,
terminal.
$ rails g migration RemoveFaculity_idFromMajor faculity:references
Running via Spring preloader in process 8806
invoke active_record
create db/migrate/20200207160003_remove_faculity_id_from_major.rb
$ rails db:migrate
== 20200207160003 RemoveFaculityIdFromMajor: migrating ========================
-- remove_reference(:majors, :faculity, {:foreign_key=>true})
-> 0.0078s
== 20200207160003 RemoveFaculityIdFromMajor: migrated (0.0083s) ===============
scheme.rb
create_table "majors", force: :cascade do |t|
t.index ["Faculity_id"], name: "index_majors_on_faculity_id"
end
여전히 Faculity_id가 있습니다. 왜---- (피엔)
이제 이것은 테이블 통째로 지워 버리자! ! ! ! ! (테이블 삭제에 첫 도전)
삭제 명령은 이쪽을 참고로 했습니다.
[Rails] 더 이상 필요하지 않은 모델을 삭제하는 방법( htps : // 우리를 위해. 코 m/포 st-9880/ )
terminal.
$ rails g migration drop_table_(テーブル名複数形)
migration 파일에 삭제할 테이블 이름을 설명하고 $rails db:migrate를 실행합니다.
20200207073446_○○_majors.rb
def change
drop_table :majors(テーブル名複数形)
end
일련의 명령 흐름
terminal.
$ rails g migration drop_table_majors
Running via Spring preloader in process 9120
invoke active_record
create db/migrate/20200207160634_drop_table_majors.rb
$ rails db:migrate
== 20200207160634 DropTableMajors: migrating ==============================
== 20200207160634 DropTableMajors: migrating ==================================
-- drop_table(:majors)
-> 0.0020s
이제 마침내 Faculity_id가 삭제되었습니다! ! ! (테이블마다 사라졌지만 (웃음))
모델 관련 파일도 삭제합니다.
· 모델 파일 삭제 app/models/major.rb
· test 파일 삭제 test/models/major_test.rb
· fixtures 파일 삭제 test/fixtures/majors.yml
새로운 모델을 만들자! 하지만 또 새로운 문제가,,,
terminal.
$ rails g model Major name:string faculity:references
Running via Spring preloader in process 9606
invoke active_record
conflict db/migrate/20200207161950_create_majors.rb
Another migration is already named create_majors: /home/ec2-user/environment/review/db/migrate/20200207072743_create_majors.rb. Use --force to replace this migration or --skip to ignore conflicted file.
분명히 migrate 폴더에있는 마지막 Major model을 만든 migration 파일이 남아 있기 때문입니다.
migrate 폴더에서 migration 파일을 삭제하면 heroku로 업그레이드 할 때 데이터베이스가 잘 작성되지 않을 수 있지만 새 모델을 작성하기 때문에 괜찮다고 믿습니다.
migration 파일 삭제 후 다시 시도! ! !
$ rails g model Major name:string faculity:references
Running via Spring preloader in process 10134
invoke active_record
create db/migrate/20200207162947_create_majors.rb
create app/models/major.rb
invoke test_unit
create test/models/major_test.rb
create test/fixtures/majors.yml
$ rails db:migrate
== 20200207162947 CreateMajors: migrating =====================================
-- create_table(:majors)
-> 0.0034s
== 20200207162947 CreateMajors: migrated (0.0040s) ============================
무사할 수 있었다! ! !
seed 파일도 괜찮은지 확인한다.
terminal.
$ rails db:seed
이쪽도 안전 에러가 나오지 않는다! ! ! ! !
(교훈) 데이터베이스를 만들 때 대문자 소문자에주의
모델 작성은 대문자
terminal.
$ rails g model User(大文字)
열의 작성은 소문자
terminal.
$ rails g migration AddPostToUser user:references(小文字)
여러분도, 이러한 항목에 주의를 기울여, 즐겁게 앱 개발해 주세요! ! !
이것이 도움이되면 다행입니다!
Reference
이 문제에 관하여(외래 키 작성 시 주의사항), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Ryukku/items/d98cca5458ca0e23cdd3텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)