외래 키 작성 시 주의사항

테마「데이터베이스 이니셜은 대문자인가 소문자인가」



이 게시물은 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(小文字)

여러분도, 이러한 항목에 주의를 기울여, 즐겁게 앱 개발해 주세요! ! !
이것이 도움이되면 다행입니다!

좋은 웹페이지 즐겨찾기