웹 개발을 하는데 있어서 정보들을 저장하는 DB schema 또한 개발된다.

문제는 이러한 DB의 버전 관리가 매우 어렵다는 것이다.

레일즈에서는 DB의 버전 관리를 보다 쉽게 할 수 있는 도구(마이그레이션)을 제공한다.

 

마이그레이션은 단지 db/migrate 디렉토리에 있는 루비 소스 파일에 불과하다.

각 마이그레이션의 파일 이름은 세 자리 버전 숫자와 밑줄 문자로 시작한다.

마이그레이션을 생성하는 방법에는 크게 두 가지가 있다.

모델을 생성할 때 마이그레이션이 기본적으로 생성된다.

(물론 --skip-migration 옵션을 통해 생성되지 않게 할 수도 있다)

 ruby script/generate model account

또는 모델과는 상관없이 그냥 마이그레이션을 추가할 수도 있다.

 ruby script/generate migration add_account

사실 db/migrate에 원하는 파일을 직접 만들어서 작성해도 되지만 권장되지 않는다.

 

마이그레이션 파일을 작성하기에 앞서 마이그레이션을 실행하는 방법을 알아보자.

마이그레이션은 rake 프로그램을 통해 실행할 수 있다.

 rake db:migrate

이 명령은 현재 마이그레이션되지 않은 파일이 있으면 그 정보를 DB에 반영한다.

만약 현재 DB 버전이 최신 버전이라면 아무것도 반영되지 않는다.

이어서, DB를 이전 버전으로 돌리고 싶은 경우가 있을 것이다.

이 경우에는 rake task에 VERSION=?? 옵션을 주어 원하는 버전으로 되돌릴 수 있다.

 rake db:migrate VERSION=12

이제 마이그레이션 파일을 작성하는 방법에 대해 알아보도록 한다.

 

제일 처음 마이그레이션 파일을 생성하면 다음과 같은 구조를 볼 수 있다.

(흐린 부분은 마이그레이션 종류에 따라 바뀔 수 있음)

class Account < ActiveRecord::Migration

 def self.up

  # 모델을 생성한 경우엔 다음 코드가 추가되어있음

  create_table :accounts do |t|

  end

 end

 

 def self.down

  # 모델을 생성한 경우엔 다음 코드가 추가되어있음

  drop_table :accounts

 end

end

여기서 self.up은 DB schema 변경을 적용하는 역할을 하고,

self.down은 DB schema를 뒤로 되돌리는 역할을 한다.

 

이제 기본적으로 마이그레이션에 사용되는 코드들을 한번 보도록 한다.

 

table_name이라는 테이블 생성

create_table :table_name do |t| ... end

여기에 :option => "auto_increment = 100"과 같이 여러 SQL 설정을 조작할 수 있다.

또한 :primary_key => :login_id와 같이 기본 키를 직접 지정할 수도 있다.

(이 옵션을 주지 않고 :id => false 옵션을 주면 기본 키가 없는 테이블이 만들어진다)

 

table_name이라는 테이블 제거

drop_table :table_name

 

테이블 table_name1의 이름을 table_name2로 변경

rename_table :table_name1, :table_name2

단, 테이블 이름을 바꾸는 경우 문제가 되는 경우가 많으므로 주의해야 한다.

 

테이블에 컬럼 등록 / 추가 / 제거 / 이름바꾸기

컬럼을 등록할 때는 테이블 생성시에 같이 작성해주어야 한다.

create_table :table_name do |t|

 t.column :column1, :string

 t.column :column2, :integer

end

이후에 컬럼 추가 / 제거 / 이름 바꾸기는 다음과 같이 할 수 있다.

add_column :table_name, :column3, :float

remove_column :table_name, :column2

rename_column :table_name, :column3, :column4


저작자 표시 비영리
Posted by 티엘로