Migration

김수민·2023년 8월 1일

Ruby on Rails 1.2.6

목록 보기
1/8
post-thumbnail

Migration?

SQL문을 대신 작성해주는 루비 코드
DB 스키마 버전 관리 시스템

https://rubykr.github.io/rails_guides/migrations.html

생성

Migration 생성

방법 1) migration 생성


터미널에 아래 구문 작성

[rails 1.2.6]
ruby script/generate migration 파일명
[rails 6 ruby 2.7.7]
rails g migration 파일명

방법 2) models 생성

models와 migration을 동시에 생성하는 방법이다.

migration만 생성하면 새로운 테이블 수정 삭제 코드 및 기존에 만들어진 테이블의 수정 삭제 코드를,
models를 생성하면 새로운 테이블의 수정 삭제 코드를 작성할 수 있다.


터미널에 아래 구문 작성

ruby script/generate model table명

mysql 생성

  1. config 폴더 > database.yml의
    development: 이하에 위 예시와 같이 database, username, password 지정

  2. 터미널에서 아래 구문 작성

mysql -유저명 -비밀번호
// ex) mysql -root -pass1234


3. 실제 적용된 sql 구문이 보고 싶을 경우, 터미널에서 아래 구문 작성

tail -f development.log

수정

테이블 생성

migrate 이하의 파일을 열어 아래 구문을 추가로 작성한다.

create_table :'테이블 명' do |함수명|
함수명.column :'column명', :'타입지정', :'추가사항'

타입지정

작성법의미
:integer정수
:float실수
:text문자열
:boolean참/거짓
:date날짜
:time시간

추가사항

작성법의미
:null => falsenull 불가능
:default => 1기본값 = 1

일괄처리 : 연결 키 추가

https://rubykr.github.io/rails_guides/association_basics.html

1. migrate에 작성

생성 구문 작성
위 참고
추가 구문 작성

add_column :'작성할 테이블 명', :'column 명' , :'타입지정'


위와 같이 생성된다.

self.up에 add_column을 작성했을 경우
self.down에는 remove_column을 작성해야한다.

2. models에 작성


Userhas_many :cars를 걸었더니 Car의 attributes에 user_id가 추가되었다.
Carbelongs_to :user가 걸려있을 것이다.

Userbelongs_to :parent를 걸었더니 User의 attributes에 parent_id가 추가되었다.
Parent에는 has_many :users가 걸려있을 것이다.

작성법작성할 위치단수/복수
belongs_to :B외래 키B가 이 클래스의 테이블에 있음단수
has_one :B이 클래스를 참조하는 다른 테이블에 외래 키B 가 있음단수
has_many :B이 클래스를 참조하는 다른 테이블에 외래 키B 가 있음복수
has_many: through BB “객체의 예를 통해서 여러개 가진다”
has_one :through BB “객체의 예를 통해서 하나 가진다”
has_and_belongs_to_many BB “객체의 예에 속해 있으면서 동시에 B 객체의 예를 많이 가진다”

번외: belongs_to 조건 작성

 belongs_to :B, :class_name => "참조할 테이블", "내 테이블의 자식 column" 

번외 : belongs_to [must exist Error] 수정

  belongs_to :B, optional: true

null이 될 수 도 있는 연결 값에 optional : true를 지정한다.


실행


터미널에서 아래 구문 작성

rake db:migrate

삭제

column 삭제

remove_column :'column명', :'column명'

table 삭제

drop_table :'테이블 명'

Con에서 Record 구하기 구문

Controller에서 DB의 데이터 값에 관여하고자 할 때 작성하는 구문

변수명 = "테이블명".find 			# find/ count
	:all, 						# all/first
	:conditions => "조건",	
    :limit => 숫자,
    :order => " DESC/ASC" 		#DESC/ASC

더 많은 명령어를 알고 싶을 경우 (Click)

ruby script/console


터미널 혹은 Ruby 파일 내에서 작성

수정

변수 = 테이블명.new
변수.column명 = "새로 넣어줄 값"
변수명.save

삭제

변수명.destroy

길이구하기

변수 = "테이블명".count
:all,
:conditions => "조건"

찾기

작성법의미
변수 = 테이블명.find :all찾아서 나오는 전체 찾기
변수 = 테이블명.find :first찾아서 나오는 하나 찾기
변수 = 테이블명.count :all찾아서 나오는 전체 결과 세기
변수 = 테이블명.find :all :conditions => "id=1"조건문을 충족하는 경우 찾기
변수 = 테이블명.find :all :order => "id desc"id 오름차순으로 찾기

연결키 사용하기 : 최적화


받아온 데이터의 .target_user (model에 연결키 지정이 되어있음)값을 배열에 넣고자 할 때,
위와 같은 방법을 사용하면 데이터의 갯수만큼 데이터를 뽑아오게된다.


하지만 :include => :연결키 를 지정해주면 실행값은 똑같아 보이지만
DB상에서 1번만 데이터를 뽑아온다. = 최적화가 된다.

❗Con 뿐만 아니라 View에서도 DB데이터로 받아온 것을 반복문 돌릴 경우, 해당 작업을 해주는 편이 좋다.

여러개


여러개를 include할 때에는 []로 묶는다.

여러번


연결 키를 여러번 거칠 때에는 화살표 함수를 사용한다 :함수 => :함수

[특징] DESC ASC


이렇게 include로 연결할 경우, Sql문 상에서 테이블 명에 AS를 붙여 테이블명을 임의 지정하므로 order와 같이 sql문에 영향을 끼치는 구문을 작성할 때에는 As로 바뀐 테이블명을 작성해주어야한다.
데이터를 받아온 뒤인 View에서는 @logs.name과 같이 사용할 수 있다.

[특징] #23000Column 'id' in where clause is ambiguous:


id와 같이 연결한 테이블과 연결되는 테이블 둘 다 갖고 있는 column명을 조건으로 줄때에는, 해당 column이 어떤 테이블의 column인지 명시해주어야한다.
User의 id라면 => users.id

profile
sumin0gig

1개의 댓글

comment-user-thumbnail
2023년 8월 1일

이런 유용한 정보를 나눠주셔서 감사합니다.

답글 달기