Ruby on Rails
ActiveRecord 마이그레이션
수색…
매개 변수
열 유형 | 기술 |
---|---|
:primary_key | 기본 키 |
:string | 더 짧은 문자열 데이터 유형. 최대 문자 수에 대한 limit 옵션을 허용합니다. |
:text | 더 많은 양의 텍스트. 최대 바이트 수에 대한 limit 옵션을 허용합니다. |
:integer | 정수. 최대 바이트 수에 대한 limit 옵션을 허용합니다. |
:bigint | 더 큰 정수 |
:float | 흙손 |
:decimal | 가변 정밀도가있는 십진수입니다. precision 와 scale 옵션을 허용합니다. |
:numeric | precision 와 scale 옵션을 허용합니다. |
:datetime | 날짜 / 시간에 대한 DateTime 객체입니다. |
:time | 시간에 대한 시간 객체. |
:date | 날짜의 Date 객체입니다. |
:binary | 이진 데이터. 최대 바이트 수에 대한 limit 옵션을 허용합니다. |
:boolean | 부울 |
비고
대부분의 마이그레이션 파일은
db/migrate/
디렉토리에 있습니다. 파일 이름의 시작 부분에 UTC 시간 소인으로 식별됩니다 (YYYYMMDDHHMMSS_create_products.rb
.rails generate
명령은rails g
으로 단축 될 수 있습니다.a
:type
이 필드에 전달되지 않으면 기본값은 문자열입니다.
특정 마이그레이션 실행
특정 마이그레이션을 위나 아래로 실행하려면 db:migrate:up
또는 db:migrate:down
.
특정 이전 :
rake db:migrate:up VERSION=20090408054555
rails db:migrate:up VERSION=20090408054555
특정 이전 :
rake db:migrate:down VERSION=20090408054555
rails db:migrate:down VERSION=20090408054555
위 명령의 버전 번호는 마이그레이션 파일 이름의 숫자 접두사입니다. 예를 들어 마이그레이션 20160515085959_add_name_to_users.rb
마이그레이션하려면 20160515085959
를 버전 번호로 사용합니다.
조인 테이블 만들기
students
courses
사이에 조인 테이블을 만들려면 다음 명령을 실행합니다.
$ rails g migration CreateJoinTableStudentCourse student course
이렇게하면 다음 마이그레이션이 생성됩니다.
class CreateJoinTableStudentCourse < ActiveRecord::Migration[5.0]
def change
create_join_table :students, :courses do |t|
# t.index [:student_id, :course_id]
# t.index [:course_id, :student_id]
end
end
end
다른 환경에서 마이그레이션 실행
test
환경에서 마이그레이션을 실행하려면 다음 쉘 명령을 실행하십시오.
rake db:migrate RAILS_ENV=test
Rails 5.0부터 rake
대신 rails
을 사용할 수 있습니다.
rails db:migrate RAILS_ENV=test
테이블에 새 열 추가
users
테이블에 새 열 name
을 추가하려면 다음 명령을 실행하십시오.
rails generate migration AddNameToUsers name
그러면 다음 마이그레이션이 생성됩니다.
class AddNameToUsers < ActiveRecord::Migration[5.0]
def change
add_column :users, :name, :string
end
end
마이그레이션 이름의 형식이 AddXXXToTABLE_NAME
이고 데이터 유형이있는 열의 목록이면 생성 된 마이그레이션에 적절한 add_column
문이 포함됩니다.
인덱스가있는 새 열 추가
새로운 색인 열 email
을 users
테이블에 추가하려면 다음 명령을 실행합니다.
rails generate migration AddEmailToUsers email:string:index
이렇게하면 다음 마이그레이션이 생성됩니다.
class AddEmailToUsers < ActiveRecord::Migration[5.0]
def change
add_column :users, :email, :string
add_index :users, :email
end
end
테이블에서 기존 열 제거
users
테이블에서 기존 열 name
을 제거하려면 다음 명령을 실행하십시오.
rails generate migration RemoveNameFromUsers name:string
이렇게하면 다음 마이그레이션이 생성됩니다.
class RemoveNameFromUsers < ActiveRecord::Migration[5.0]
def change
remove_column :users, :name, :string
end
end
마이그레이션 이름의 형식이 RemoveXXXFromYYY
이고 데이터 유형이있는 열 목록이 있으면 생성 된 마이그레이션에 적절한 remove_column
문이 포함됩니다.
데이터 유형 (예 :string
)을 remove_column
의 매개 변수로 지정할 필요는 없지만 적극 권장합니다. 데이터 유형이 지정되지 않은 경우, 마이그레이션은 되돌릴 수 없게됩니다.
표에 참조 열 추가
team
에 대한 참조를 users
테이블에 추가하려면 다음 명령을 실행합니다.
$ rails generate migration AddTeamRefToUsers team:references
그러면 다음 마이그레이션이 생성됩니다.
class AddTeamRefToUsers < ActiveRecord::Migration[5.0]
def change
add_reference :users, :team, foreign_key: true
end
end
이 마이그레이션은 users
테이블에 team_id
열을 생성합니다.
추가 된 열에 적절한 index
과 foreign_key
를 추가하려면 rails generate migration AddTeamRefToUsers team:references:index
하도록 명령을 변경하십시오. 이렇게하면 다음 마이그레이션이 생성됩니다.
class AddTeamRefToUsers < ActiveRecord::Migration
def change
add_reference :users, :team, index: true
add_foreign_key :users, :teams
end
end
당신이 자동 생성 레일보다 다른 참조 열 이름을 지정할 경우, 마이그레이션에 다음을 추가합니다 (예를 : 당신은 전화를 할 수 있습니다 User
생성 된 Post
로 Author
에 Post
테이블)
class AddAuthorRefToPosts < ActiveRecord::Migration
def change
add_reference :posts, :author, references: :users, index: true
end
end
새 테이블 만들기
열 name
과 salary
로 새 users
테이블을 만들려면 다음 명령을 실행합니다.
rails generate migration CreateUsers name:string salary:decimal
이렇게하면 다음 마이그레이션이 생성됩니다.
class CreateUsers < ActiveRecord::Migration[5.0]
def change
create_table :users do |t|
t.string :name
t.decimal :salary
end
end
end
이주 이름의 형식이 CreateXXX
이고 데이터 유형이있는 컬럼 목록이 있으면, 나열된 컬럼이있는 테이블 XXX
를 작성하는 이주가 생성됩니다.
테이블에 여러 열 추가
테이블에 여러 열을 추가하려면 rails generate migration
명령을 사용할 때 field:type
쌍을 공백으로 분리하십시오.
일반적인 구문은 다음과 같습니다.
rails generate migration NAME [field[:type][:index] field[:type][:index]] [options]
예를 들어, 다음은 name
, salary
및 email
필드를 users
테이블에 추가합니다.
rails generate migration AddDetailsToUsers name:string salary:decimal email:string
다음 마이그레이션을 생성합니다.
class AddDetailsToUsers < ActiveRecord::Migration[5.0]
def change
add_column :users, :name, :string
add_column :users, :salary, :decimal
add_column :users, :email, :string
end
end
마이그레이션 실행
명령 실행 :
rake db:migrate
rails db:migrate
대상 버전을 지정하면 지정된 버전에 도달 할 때까지 필수 마이그레이션 (위, 아래, 변경)이 실행됩니다. 여기서 version number
는 이전 파일 이름에 대한 숫자 접두사입니다.
rake db:migrate VERSION=20080906120000
rails db:migrate VERSION=20080906120000
마이그레이션 롤백
change
메소드를 되돌리거나 down
메소드를 실행하여 최신 마이그레이션을 rollback
하십시오. 명령 실행 :
rake db:rollback
rails db:rollback
최근 3 번의 마이그레이션 롤백
rake db:rollback STEP=3
rails db:rollback STEP=3
STEP
은 되돌릴 마이그레이션 수를 제공합니다.
모든 이전 롤백
rake db:rollback VERSION=0
rails db:rollback VERSION=0
테이블 변경
스키마가 잘못된 테이블을 작성한 경우, 컬럼 및 해당 등록 정보를 변경하는 가장 쉬운 방법은 change_table
입니다. 다음 예제를 검토하십시오.
change_table :orders do |t|
t.remove :ordered_at # removes column ordered_at
t.string :skew_number # adds a new column
t.index :skew_number #creates an index
t.rename :location, :state #renames location column to state
end
위의 마이그레이션은 테이블 orders
변경합니다. 다음은 변경 사항에 대한 라인 별 설명입니다.
-
t.remove :ordered_at
는 테이블orders
에서ordered_at
열을 제거합니다. -
t.string :skew_number
는orders
테이블에skew_number
라는 새 문자열 유형 컬럼을 추가합니다. -
t.index :skew_number
는orders
테이블의skew_number
열에 인덱스를 추가합니다. -
t.rename :location, :state
이름을 변경location
에서 열orders
에 테이블state
.
테이블에 고유 한 열 추가
users
새로운 고유 한 열 email
을 추가하려면 다음 명령을 실행합니다.
rails generate migration AddEmailToUsers email:string:uniq
이렇게하면 다음 마이그레이션이 생성됩니다.
class AddEmailToUsers < ActiveRecord::Migration[5.0]
def change
add_column :users, :email, :string
add_index :users, :email, unique: true
end
end
기존 열 유형 변경
이전과 함께 레일스의 기존 열을 수정하려면 다음 명령을 실행합니다.
rails g migration change_column_in_table
이렇게하면 db/migration
디렉토리에 새 마이그레이션 파일이 생성됩니다 (아직없는 경우). 타임 스탬프와 접두어가 붙은 파일과 마이그레이션 파일 이름에 아래 내용이 포함됩니다.
def change
change_column(:table_name, :column_name, :new_type)
end
더 길지만 더 안전한 방법
위의 코드는 사용자가 마이그레이션을 롤백 할 수 없도록합니다. change
메소드를 별도의 up
및 down
메소드로 분리하여이 문제점을 피할 수 있습니다.
def up
change_column :my_table, :my_column, :new_type
end
def down
change_column :my_table, :my_column, :old_type
end
마이그레이션 다시 실행
redo
명령을 사용하여 롤백 한 후 다시 이주 할 수 있습니다. 이것은 기본적으로 rollback
과 migrate
작업을 결합한 지름길입니다.
명령 실행 :
rake db:migrate:redo
rails db:migrate:redo
STEP
매개 변수를 사용하여 두 개 이상의 버전으로 되돌릴 수 있습니다.
예를 들어 3 개의 이전으로 돌아가려면 다음을 수행하십시오.
rake db:migrate:redo STEP=3
rails db:migrate:redo STEP=3
기본값이있는 열 추가
다음 예제에서는 users
테이블에 admin
열을 추가하고 해당 열에 기본값 false
합니다.
class AddDetailsToUsers < ActiveRecord::Migration[5.0]
def change
add_column :users, :admin, :boolean, default: false
end
end
예를 들어 PostgreSQL과 같이 큰 테이블에서는 기본값이있는 마이그레이션이 오래 걸릴 수 있습니다. 이는 새로 추가 된 열의 기본값을 사용하여 각 행을 업데이트해야하기 때문입니다. 이를 방지하고 배포 중 중단 시간을 줄이려면 다음 세 단계로 마이그레이션을 분리 할 수 있습니다.
- 위와 비슷한
add_column
-migration을 추가하지만 기본값은 설정하지 않습니다. - 응용 프로그램이 실행되는 동안 레이크 작업이나 콘솔에 열을 배포하고 업데이트하십시오. 응용 프로그램이 새 / 업데이트 된 행에 대한 해당 열의 데이터를 이미 쓰는지 확인하십시오.
- 다른
change_column
마이그레이션을 추가하면 해당 컬럼의 기본값이 원하는 기본값으로 변경됩니다
null 값 금지
테이블 열에 null
값을 금지하려면 :null
과 같이 :null
매개 변수를 마이그레이션에 추가하십시오.
class AddPriceToProducts < ActiveRecord::Migration
def change
add_column :products, :float, null: false
end
end
이전 상태 확인
다음을 실행하여 이전 상태를 확인할 수 있습니다.
rake db:migrate:status
rails db:migrate:status
결과는 다음과 같습니다.
Status Migration ID Migration Name
--------------------------------------------------
up 20140711185212 Create documentation pages
up 20140724111844 Create nifty attachments table
up 20140724114255 Create documentation screenshots
up 20160213170731 Create owners
up 20160218214551 Create users
up 20160221162159 ********** NO FILE **********
up 20160222231219 ********** NO FILE **********
status 필드에서 up
은 마이그레이션이 실행되었음을 의미하고 down
은 마이그레이션을 실행해야 함을 의미합니다.
hstore 열 만들기
Hstore
열은 설정을 저장하는 데 유용 할 수 있습니다. 확장 기능을 활성화 한 후에는 PostgreSQL 데이터베이스에서 사용할 수 있습니다.
class CreatePages < ActiveRecord::Migration[5.0]
def change
create_table :pages do |t|
enable_extension 'hstore' unless extension_enabled?('hstore')
t.hstore :settings
t.timestamps
end
end
end
자체 참조 추가
자체 참조는 계층 적 트리를 만드는 데 유용 할 수 있습니다. 이는 이주시 add_reference
를 사용하여 수행 할 수 있습니다.
class AddParentPages < ActiveRecord::Migration[5.0]
def change
add_reference :pages, :pages
end
end
외래 키 열은 pages_id
됩니다. 외래 키 열 이름을 결정하려면 먼저 열을 작성한 후 참조를 추가해야합니다.
class AddParentPages < ActiveRecord::Migration[5.0]
def change
add_column :pages, :parent_id, :integer, null: true, index: true
add_foreign_key :pages, :pages, column: :parent_id
end
end
배열 열 만들기
array
열은 PostgreSQL에서 지원됩니다. Rails는 자동으로 PostgreSQL 배열을 Ruby 배열로 변환하며, 그 반대의 경우도 마찬가지입니다.
array
열이있는 테이블을 만듭니다.
create_table :products do |t|
t.string :name
t.text :colors, array: true, default: []
end
기존 테이블에 array
열을 추가합니다.
add_column :products, :colors, array: true, default: []
array
열에 대한 색인을 추가하십시오.
add_index :products, :colors, using: 'gin'
기존 데이터에 NOT NULL 제약 조건 추가
users
테이블에 외래 키 company_id
를 추가하려고하고 NOT NULL
제약 조건을 원한다고 가정 company_id
십시오. users
이미 데이터가있는 경우 여러 단계에서이 작업을 수행해야합니다.
class AddCompanyIdToUsers < ActiveRecord::Migration
def up
# add the column with NULL allowed
add_column :users, :company_id, :integer
# make sure every row has a value
User.find_each do |user|
# find the appropriate company record for the user
# according to your business logic
company = Company.first
user.update!(company_id: company.id)
end
# add NOT NULL constraint
change_column_null :users, :company_id, false
end
# Migrations that manipulate data must use up/down instead of change
def down
remove_column :users, :company_id
end
end