수색…


매개 변수

열 유형 기술
:primary_key 기본 키
:string 더 짧은 문자열 데이터 유형. 최대 문자 수에 대한 limit 옵션을 허용합니다.
:text 더 많은 양의 텍스트. 최대 바이트 수에 대한 limit 옵션을 허용합니다.
:integer 정수. 최대 바이트 수에 대한 limit 옵션을 허용합니다.
:bigint 더 큰 정수
:float 흙손
:decimal 가변 정밀도가있는 십진수입니다. precisionscale 옵션을 허용합니다.
:numeric precisionscale 옵션을 허용합니다.
: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 .

특정 이전 :

5.0
rake db:migrate:up VERSION=20090408054555
5.0
rails db:migrate:up VERSION=20090408054555 

특정 이전 :

5.0
rake db:migrate:down VERSION=20090408054555
5.0
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
5.0

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 문이 포함됩니다.

인덱스가있는 새 열 추가

새로운 색인emailusers 테이블에 추가하려면 다음 명령을 실행합니다.

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 열을 생성합니다.

추가 된 열에 적절한 indexforeign_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 생성 된 PostAuthorPost 테이블)

class AddAuthorRefToPosts < ActiveRecord::Migration
  def change
    add_reference :posts, :author, references: :users, index: true
  end
end

새 테이블 만들기

namesalary 로 새 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 , salaryemail 필드를 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

마이그레이션 실행

명령 실행 :

5.0
rake db:migrate
5.0
rails db:migrate

대상 버전을 지정하면 지정된 버전에 도달 할 때까지 필수 마이그레이션 (위, 아래, 변경)이 실행됩니다. 여기서 version number 는 이전 파일 이름에 대한 숫자 접두사입니다.

5.0
rake db:migrate VERSION=20080906120000
5.0
rails db:migrate VERSION=20080906120000

마이그레이션 롤백

change 메소드를 되돌리거나 down 메소드를 실행하여 최신 마이그레이션을 rollback 하십시오. 명령 실행 :

5.0
rake db:rollback
5.0
rails db:rollback

최근 3 번의 마이그레이션 롤백

5.0
rake db:rollback STEP=3
5.0
rails db:rollback STEP=3

STEP 은 되돌릴 마이그레이션 수를 제공합니다.

모든 이전 롤백

5.0
rake db:rollback VERSION=0
5.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 변경합니다. 다음은 변경 사항에 대한 라인 별 설명입니다.

  1. t.remove :ordered_at 는 테이블 orders 에서 ordered_at 열을 제거합니다.
  2. t.string :skew_numberorders 테이블에 skew_number 라는 새 문자열 유형 컬럼을 추가합니다.
  3. t.index :skew_numberorders 테이블의 skew_number 열에 인덱스를 추가합니다.
  4. 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 메소드를 별도의 updown 메소드로 분리하여이 문제점을 피할 수 있습니다.

def up
  change_column :my_table, :my_column, :new_type
end

def down
  change_column :my_table, :my_column, :old_type
end

마이그레이션 다시 실행

redo 명령을 사용하여 롤백 한 후 다시 이주 할 수 있습니다. 이것은 기본적으로 rollbackmigrate 작업을 결합한 지름길입니다.

명령 실행 :

5.0
rake db:migrate:redo
5.0
rails db:migrate:redo

STEP 매개 변수를 사용하여 두 개 이상의 버전으로 되돌릴 수 있습니다.

예를 들어 3 개의 이전으로 돌아가려면 다음을 수행하십시오.

5.0
rake db:migrate:redo STEP=3
5.0
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과 같이 큰 테이블에서는 기본값이있는 마이그레이션이 오래 걸릴 수 있습니다. 이는 새로 추가 된 열의 기본값을 사용하여 각 행을 업데이트해야하기 때문입니다. 이를 방지하고 배포 중 중단 시간을 줄이려면 다음 세 단계로 마이그레이션을 분리 할 수 ​​있습니다.

  1. 위와 비슷한 add_column -migration을 추가하지만 기본값은 설정하지 않습니다.
  2. 응용 프로그램이 실행되는 동안 레이크 작업이나 콘솔에 열을 배포하고 업데이트하십시오. 응용 프로그램이 새 / 업데이트 된 행에 대한 해당 열의 데이터를 이미 쓰는지 확인하십시오.
  3. 다른 change_column 마이그레이션을 추가하면 해당 컬럼의 기본값이 원하는 기본값으로 변경됩니다

null 값 금지

테이블 열에 null 값을 금지하려면 :null 과 같이 :null 매개 변수를 마이그레이션에 추가하십시오.

class AddPriceToProducts < ActiveRecord::Migration
  def change
    add_column :products, :float, null: false
  end
end

이전 상태 확인

다음을 실행하여 이전 상태를 확인할 수 있습니다.

3.0 5.0
rake db:migrate:status
5.0
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


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow