今回はこのversionでやります
rails: 5.2.3
ruby: 2.6.1
migrationとは
Active Recordの機能の1つであり、データベーススキーマを長期にわたって安定して発展・増築し続けることができるようにするための仕組み
ruby on rails使っててデータベースを変更するときに楽なやつ
メリット
SQL書かずにデータベース作れるしコマンドや書き方もわかりやすいから簡単
デメリット
SQL書かずにデータベース作るから「あれほんまにこれでええんやっけ」とか設計書見て脳死で作ってしまう恐れあるからきをつけようね(3敗)
migrationの大まかな流れ
1.モデル作成します
$ bundle exec rails g model モデル名
(migrationファイルとmodelファイル同時に作ってくれる)
たまーにミスりますが、railsのmodelファイルは複数じゃなくて単数系でお願いします
migrationファイルはテーブル名と一緒になるんで、上のコマンド打てば勝手に複数系で作ってくれるよ
マイグレーションファイルだけ作成できるコマンドもあるよ
$ bundle exec rails g migration クラス名
2.migrationファイルを書いていく
$ bundle exec rails g modelUser
とかでてきとうにつくったら下記みたいなmigrationファイル作られるよ
20190XXXXXXXXXX_create_users.rb
↑作った日付
作られる場所は
db/migrate/XXXXXX ←ここ
class CreateUsers < ActiveRecord::Migration[5.2]
def change
t.timestamps
end
end
end
んでこんな感じのファイルできたらどんどん書いてくよ
class CreateUsers < ActiveRecord::Migration[5.2]
def change
create_table :users, id: :integer, limit: 4, comment: 'ユーザーテーブル' do |t|
t.string :user_key, null: false, comment: 'ユーザユニークキー'
t.timestamps
end
end
end
上記ではusersというテーブルを作成してプライマリーキーを設定して
user_keyというカラムを作成してます
3.インデックスキーの作成
class CreateUsers < ActiveRecord::Migration[5.2]
def change
create_table :users, id: :integer, limit: 4, comment: 'ユーザーテーブル' do |t|
t.string :user_key, null: false, comment: 'ユーザユニークキー'
t.timestamps
end
# 一つのカラムにユニーク制約をかけたい場合
add_index :users, :key, :unique => true
# 複数カラムでユニーク制約をかけたい場合
add_index :users, [:key1, :key2, :key3], :unique => true, :name => 'hoge_uniq_index'
end
end
create_table外ににadd_index:[テーブル名]:[カラム名]:unique => trueで制約かけれる
4.カラム削除
削除したいカラムがあるテーブルとかでマイグレーションファイルを作成
$ bundle rails g migration RemoveUserKeyFromUsers user_key, :string
カラムを削除したいとき
def up
remove_column :users, user_key
end
def down
add_column :users :user_key, :string
end
そしてmigrate実行
$ bundle exec rails db:migrate
こんな感じでクラス名で指定したテーブルに対してカラムを削除するための文が記述されています。(この場合はchangeメソッドではなくupメソッドとdownメソッドを分けて記述する必要があります)。
このように比較的使われるとカラムの追加と削除についてはここでご紹介した方法を使うと少し簡単にマイグレーションスクリプトを作成できます。
ただ正直resetコマンド(後で紹介する)使ったほうが楽だよね
でもテーブルの中身消しちゃいけない感じなら上記の方法でやる必要がありますね
5.中間テーブル作成
referenceというパラメータを使う
reference(参照)はテーブル同士の関係性を示します。
class CreateUsers < ActiveRecord::Migration[5.2]
def change
create_table :users, id: :integer, limit: 4, comment: 'ユーザーテーブル' do |t|
t.string :user_key, null: false, comment: 'ユーザユニークキー'
t.references :users, index: true, foreign_key: true
t.timestamps
end
end
end
その後、migrateします。
$ bundle exec rails db:migrate
マイグレーションコマンド一覧
# マイグレート実行
$ bundle exec rails db:migrate
# ロールバック
$ bundle exec rails db:rollback
# 確認
$ bundle exec rails db:migrate:status
# リセット
$ bundle exec rails db:migrate:reset
# カラムのデータ型を変えたい時
$ bundle exec rails g migration ChangeDatatypeカラム名Ofテーブル名
# カラムの名前を変えたい時
$ bundle exec rails g migration rename_[変更前のカラム名]_column_to_[モデル名(複数形)]
# インデックスを削除する
$ bundle exec rails g migration Delete[削除したいユニークキー名]UniqIndexFrom[テーブル名]
remove_index → index削除
:, :yyy_id
リセットと確認がよく使うかなぁ
型の対応表
MySQL Rails
varchar(255) string
varchar(文字数) string #limitで文字数を指定
tinytext text #limitの範囲が1~255
text text
midiumtext text #limitの範囲が65536~16777215
longtext text #limitの範囲が16777216 ~ 4294967285
float float
double float #limitの範囲が24~53
tinyint integer #limitが1
smallint integer #limitが2
int integer #limitが4
bigint integer #limitが8
decimal decimal
decimal(M,D) decimal #precision: M, scale: D
datetime datetime
time time
date date
blob binary
mediumblob binary #limitが16MB以下
longblob binary #limitが4GB以下
tinyint(1) boolean
まとめ
どんどんまだまだどしどしマイグレーションについて書かないといけないけどメモ的な感じだから追記、追記していきます
間違ってたらオシエテクダサイ