Rails DBに対する命令文2 ※重要
前回の続き。結局のところ今の段階ではrailsのコマンドしっかりしとけって話だったので、こっちにDB操作系のコマンドまとめとく。一番下の参考元読むのが一番いいけど、自分に取って今大事なところは以下。
基本的なテーブル作成の手順
(0. デフォルトのSQLiteを使わない場合はgemでインストールしたりconfig/database.ymlいじったりするがここでは割愛)
1. rails db:createでデータベース作成
2. rails g model モデル名 (必要であればカラム名:データ型 ・・・・・)
3. マイグレーションファイルをいじる
4. rails db:migrate する
大事なのは3番で、ここを把握すればDBを好きなようにいじれる感じ
2番で自動的にマイグレーションファイルが出来てるし、モデル生成時に自動で出来るファイルにはcreate_tableが定義済みで中身にタイムスタンプ も定義してあるから最低限のテーブルは作成されるって感じみたい。最初はあんまり考えずにテーブル出来るんやなぁくらいに考えてたけど、作成の定義は特にないファイルもある。モデル作成時以外のマイグレーションファイル生成時は、以下のようにコマンドで
rails g migration AddUserIdToPosts user_id:integer とすると
マイグレーションファイル内では
class AddUserIdToPosts < ActiveRecord::Migration
def change
add_column :posts, :user_id, :integer
end
end
等となる。
基本的には後からこんな感じでいくらでもいじれるので、削除やrollback以外はあんまり怖がらなくてもいいと思う。だだし、こういったユーザーidを加えるだけのマイグレーションファイルが無限に増えると相当管理しづらくなると思うので、普通は
create_table :テーブル名 do |t|
.
.
t.timestamps
end
の中に必要なものは記述し、index等のオプションも付けてしまうのが望ましいと思う。もちろん後から追加したくなったらrails g migration AddIndexToUser等とすればadd_indexメソッドで付与は出来る。
上のまとめで押さえておくべきなのは
create_table とadd_indexは同じレベルの物であるということ。
ただしcreate_table内で各種オプションを正しく付与して入れば無駄にrails g migrationコマンド打って細かいマイグレーションファイルを増やさずに済むっていうこと
バリデーション、外部keyについては追記の予定。内容的には別の日記に分けて書いた方がいいかも。
3番目の弄り方について参考元から抜粋
ちなみにモデル作成後はファイルを弄る方を推奨。記述場所がばらけないし、直接書いてる感が強いので。ただし、一度migrateしたファイルは基本的に弄らない。migrateする前に弄る。後日それについて書く予定だが、以下の2つのリンク参照
https://teratail.com/questions/103227
https://dev.mysql.com/doc/refman/5.6/ja/cannot-roll-back.html
要は一度処理済みのマイグレーションファイルは処理済み扱いなので追記しても反映されないし、rollbackしたら最初からやり直せるかと言えばそういう訳でもなく、結構ダメパターンがあるということ。migrateしてから弄るのはダメよ、と。
コマンドから弄る場合
操作内容 | クラス名 | コマンド実行例 |
---|---|---|
テーブルを作成 | Createテーブル名 | bin/rails g migration CreateSample |
テーブルの削除 | Dropテーブル名 | bin/rails g migration DropSample |
カラムの追加 | Addカラム名Toテーブル名 | bin/rails g migration AddColumnToSample |
カラムの削除 | Removeカラム名Fromテーブル名 | bin/rails g migration RemoveColmnFromSample |
カラム名の変更 | RenameFrom変更前カラム名To変更後カラム名Onテーブル名 | bin/rails g migration RenameFromBeforeColumnToAfterCoulumnOnSample |
カラムの定義を変更 | Change変更するカラムOnテーブル名 | bin/rails g migration ChangeColumnOnSample |
Indexの作成 | AddIndexカラム名Toテーブル名 | bin/rails g migration AddIndexColumnToSample |
Indexの削除 | RemoveIndexカラム名Fromサンプル | bin/rails g migration RemoveIndexColumnFromSample |
create_tableの中にオプション書く場合
def change
create_table :sample2s do |t|
t.string :not_null, null:false #NOT NULL制約
t.string :unique, unique:true #ユニーク制約
t.string :default, default: "default" #デフォルト値
t.string :limit, limit: 10 #LIMIT(最大長)
t.string :index, index:true #インデックス
t.string :index, comment: "comment!" #コメント
end
end
changeメソッド内に記述出来るテーブル定義のためのメソッド一覧
メソッド | 説明 | 簡単な例 |
---|---|---|
create_table | テーブルの作成 | create_table :テーブル名 do |t| |
drop_table | テーブルの削除 | drop_table :テーブル名 |
add_column | カラムの追加 | add_column :テーブル名, :カラム名, :型 |
remove_column | カラムの削除 | remove_column :テーブル名, :カラム名 |
change_column | カラムの定義の変更 | change_column :テーブル名, :カラム名, :型 [, カラムオプション] |
rename_column | カラム名の変更 | rename_column :テーブル名, :変更前カラム名, :変更後カラム名 |
add_index | インデックスの作成 | add_index :テーブル名, :カラム名 |
remove_index | インデックスの削除 | remove_index :テーブル名, :カラム名 |
add_reference | リファレンス(外部参照)の作成 | add_reference :テーブル名, :参照名,[ polymorphic: true, index: true] |
まとめると
SQLのテーブル定義と同等のことがマイグレーションファイルで定義出来る
参考元