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|
t.型 :カラム名
end
drop_table テーブルの削除 drop_table :テーブル名
add_column カラムの追加 add_column :テーブル名, :カラム名, :型
remove_column カラムの削除 remove_column :テーブル名, :カラム名
change_column カラムの定義の変更 change_column :テーブル名, :カラム名, :型 [, カラムオプション]
rename_column カラム名の変更 rename_column :テーブル名, :変更前カラム名, :変更後カラム名
add_index インデックスの作成 add_index :テーブル名, :カラム名
# 複合Index
add_index :テーブル名, [:カラム名,:カラム名]
remove_index インデックスの削除 remove_index :テーブル名, :カラム名
add_reference リファレンス(外部参照)の作成 add_reference :テーブル名, :参照名,[ polymorphic: true, index: true]

まとめると

SQLのテーブル定義と同等のことがマイグレーションファイルで定義出来る

 

参考元

https://www.sejuku.net/blog/60950