LoginSignup
0
0

More than 3 years have passed since last update.

rails migrationやりたい

Last updated at Posted at 2019-10-13

今回はこの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

まとめ
どんどんまだまだどしどしマイグレーションについて書かないといけないけどメモ的な感じだから追記、追記していきます
間違ってたらオシエテクダサイ

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0