[TIL 43] Ruby on Rails | db migrate

sunny·2021년 5월 12일
0
post-thumbnail

소스 클론 받은 후에 바로 bundle install하고

rails db:create db:migrate db:seed

  • db:create -> postgre에 rails명령어를 이용해 db create하는것
  • db:migrate -> 기존의 migrate파일을 db에 밀어넣는것
  • db:seed -> 더미데이터를 db에 밀어넣는것

db 테이블 만들기

  • rails generate model Item or rails g model Item
    -> 테이블명은 복수❌ 단수⭕️
    -> rails에서 테이블 생성시 이름이 복수로 생성됨 (ex: item -> items)

테이블이 생성되면 migrate와 models에 파일이 추가된다.


migrate

rails db:migrate -> 변경사항 마이그레이트!

rails에서 db:migrate를 할때는 schema.rb의 타임스탬프 기준 이후의 migrate 파일만 읽어온다!

t:타입 :컬럼명 -> ex: (t.string :name)
t: timestamp -> 레일즈에서 자동으로 생성되는 것.

schema.rb는 절대 직접 수정하지 않는다. -> migrate과정을 통해서 해야한다.

후에 schema.rb 확인해보면 새로 추가, 수정한 내용들이 반영되어있다.


destroy, nullify

like - user - item : destroy 관계 (user가 삭제되면 like도 삭제됨)
order - user - item : nullify관계 (user가 삭제되어도 order는 지워지지 않기 때문에!)

nullify관계일 경우 migrate파일에서 null:false 옵션을 반드시 지워주자


migrate후에 db를 수정하려면?

rails db:migrate한 후에는 이미 db에 적용이 된 후이기 때문에 migrate 파일을 수정해봤자 반영이 되지 않는다.
-> 타임스탬프 기준 이후의 migrate 파일만 읽어오기 때문에 이미 반영이 되어있는 것들에 대해서는 업데이트가 반영되지 않는다.

방법 1) rails db:rollback

rails db:rollback

  • github같은 외부저장소에 올리지 않았거나 들어가있는 데이터가 얼마없을때 사용!
  • 가장 최근에 migrate 했던 파일들을 rollback한다.

방법 2) 새로운 migrate file 생성하기

rails g migration migrate파일이름

  • 외부저장소에 이미 올라갔거나 중요한 데이터들을 많이 가지고 있을때 사용.
  • migrate 파일 이름은 마음대로 설정해도 되지만 보통 바꿀땐 change, 지울땐 remove로 하는게 컨벤션. ex) _price_columns_from_item

  • remove_column :options, :stock -> options의 stock이라는 컬럼을 지우겠다
  • add_column :options, :price, :integer -> options에 price라는 컬럼을 string값으로 생성하겠다
  • rename_column :options, :price, :option_price -> options의 price를 option_price로 수정하겠다

마이그레이션 파일은 삭제해도 되는 경우가 있고 안되는 경우가 있다.
🗑 삭제해도 되는 경우
1) db:migrate하지 않은 경우
2) 깃헙에 올라가지 않은 경우
-> 이 두 가지 경우가 모두 해당되지 않는 경우 제외 절대 삭제하지 말것


M:N Relation

특정 사용자가 좋아요한 아이템들, 특정 아이템을 좋아요한 사용자들
-> 다대다 관계!


ORM

이제 rails에서 database에 생성되어있는 테이블을 가져와서 써보자!
그런데 어떻게 가져와서 써야할까?

rails는 루비라는 언어를 사용하고 있고 postgresql은 sql언어를 사용한다.
-> 이 사이에서 통역해줄 애가 필요하다!
-> 그게 ORM
-> Ruby 문법을 통해 database를 조작할 수 있게 된다.


models

belongs_to :item -> item에 속해있다.

has_many :options, dependent: :destroy
-> option을 포함하고 있고 item이 삭제되면 option도 삭제된다.

-> option의 name은 반드시 필요하다.

-> 이 상품을 좋아요한 사용자들을 가져올건데 likes라는 레코드를 통해 가져오고 소스는 users이다. (다대다 설정)

새로 적용된 내용이 있다면 reload! 해주기!


db 정보 확인하기

rails c 콘솔 입력창 띄우기

Item.all -> Item 테이블의 모든 정보를 조회
Item.first -> 아이템 테이블의 첫번째 row를 조회
Item.find(1) -> 아이템 id값이 1번인 row를 조회
Item.find_by(name: '에어팟') -> 아이템의 name값이 에어팟인 첫번째 row를 조회
Item.where(name: '에어팟') -> 아이템 테이블에서 name값이 에어팟인 모든 row를 조회

Item.create(name: '에어팟', price: '3000')
-> Item 테이블에 name은 에어팟이고 price는 3000인 row를 하나 생성

-> ! 붙이면 error log를 볼 수 있다.


Item.find(1).options -> 1번 아이디를 갖고있는 item의 options를 불러올 수 있다. -> 이걸 가능하게 하는 건 has_many

Item.first.destroy -> 첫번째 아이템을 삭제

Item.first.update(name: '') -> 특정 컬럼값 업데이트


Ruby on Rails 명령어 정리

  • rails s (rails server) : 서버키기

  • rails c (rails console) : 콘솔 키기

  • exit : rails console에서 나가기

  • irb : ruby 문법 실행

profile
blog 👉🏻 https://kimnamsun.github.io/

0개의 댓글