前言
Migration(遷移), 其實就是Active Record對數(shù)據庫結構的操作,通過Migration無需在使用SQL命令來修改數(shù)據庫.使用簡單的Ruby DSL 就能對數(shù)據表進行修改.
1.Migration遷移文件命名
文件位置在"db/migrate"
一個Migration文件的文件名類型如下:
YYYYMMDDHHMMSS_create_products.rb
20080906120001_add_details_to_products.rb
這兩個文件名中的遷移類的名稱是用駝峰式的命名規(guī)則:
# YYYYMMDDHHMMSS_create_products.rb
class CreateProducts < ActiveRecord::Migration[5.1]
end
# 20080906120001_add_details_to_products.rb
class AddDetailsToProducts < ActiveRecord::Migration[5.1]
end
2.創(chuàng)建Migration
2.1創(chuàng)建空Migration
$ rails g migration CreateUsers
這個命令會創(chuàng)建一個空Migration(遷移)
class CreateUsers < ActiveRecord::Migration[5.1]
def change
create_table :users do |t|
end
end
end
2.2 添加字段
email如果不指定數(shù)據類型默認為string
$ rails g migration AddEmailToUsers email
生成一個名為YYYYMMDDHHMMSS_add_email_to_users.rb
的遷移
上面的命令等效于:
$ rails g migration AddEmailToUsers email:string
這個命令給users表添加一個email字段誊役。
class AddEmailToUsers < ActiveRecord::Migration[5.1]
def change
add_column :users, :email, :string
end
end
當Migration的名稱為
AddXXXToYYY
或RemoveXXXFromYYY
的形式時,會自動生成包含合適的add_column
或remove_column
語句注祖。
2.3創(chuàng)建刪除字段的Migration
$ rails g migration RemoveEmailFromUsers email:string
class RemoveEmailFromUsers < ActiveRecord::Migration[5.1]
def change
remove_column :users, :email, :string
end
end
2.4 創(chuàng)建references字段類型
使用references/belongs_to生成關系
$ rails g migration AddUserRefToCompanies user:belongs_to
生成Migration文件
class AddUserRefToCompanies < ActiveRecord::Migration[5.1]
def change
add_reference :companies, :user, foreign_key: true
end
end
這個Migration會在companies表里生成一個user_id字段并創(chuàng)建索引吮便。
2.5創(chuàng)建聯(lián)結表
命令中包含JoinTable
$ rails g migration CreateJoinTableCustomerProduct customer product
class CreateJoinTableCustomerProduct < ActiveRecord::Migration[5.1]
def change
create_join_table :customers, :products do |t|
# t.index [:customer_id, :product_id]
# t.index [:product_id, :customer_id]
end
end
end
3.運行遷移
3.1初始化數(shù)據庫
在配置完config/database.yml
文件的數(shù)據庫信息后執(zhí)行
$ rails db:setup
會根據配置文件中的配置創(chuàng)建數(shù)據庫毡泻。
3.2 重置數(shù)據庫
對應的有初始化埠帕,就有刪除數(shù)據庫褪尝。
$ rails db:dorp
配合rails db:setup
就等同于
$ rails db:reset
3.3回滾
$ rails db:rollbacke #回滾最后一次遷移
$ rails db:rollbacke STEP=3 #回滾最后三次遷移
$ rails db:rollbacke:redo STEP=3 #回滾最后三次遷移并重新執(zhí)行