웹 개발을 하는데 있어서 정보들을 저장하는 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