Tag: マイグレーション

目次

関連ページ

参考情報

マイグレーションファイルの作成

マイグレーションファイルの単体作成

  • 「rails generate migration マイグレーション名」で生成可能。NAMAKESUGI |[Rails4] migrationコマンドまとめ
  • createから始めたらcreate table、addから始めたらカラムの追加、removeから始めたらカラムの削除用のテンプレートを自動で作ってくれる。
  • Rails4のマイグレーションの書き方まとめ | @cyber_yoshidaによると、"change"にまとめる方向になっていて、"self.up"や"self.down"はなくなりインスタンスメソッドの"up"や"down"に変更されている。
  • 属性を変更する場合やカラムを削除する場合はchangeでreversibleを使って記述するか、インスタンスメソッドのup、downに記述する

テーブル生成

  • booksテーブルを生成する場合以下のコマンドを実行する。
    bundle exec rails generate migration create_books
  • ファイルを書き換える
    class CreateHoges < ActiveRecord::Migration
      def change
        create_table :hoges do |t|
          t.string :name
          t.integer :age
          t.timestamps
        end
      end
    end
    

テーブルに文字列カラムを追加する

  • booksテーブルにimageカラム(文字列)を追加する
    bundle exec rails generate migration add_image_to_books
  • ファイルを書き換える
    class AddImageToBooks < ActiveRecord::Migration
      def change
        add_column :books, :image, :string
      end
    end
    
    

テーブルの型を変更する

  • booksテーブルのtitleをstringからtextに変更する
    bundle exec rails generate migration change_title_type_of_books
  • マイグレーションファイルを編集する
    class ChangeTitleTypeOfBooks < ActiveRecord::Migration
      def change
        change_column :books, :title, :text
      end
    end
    

テーブルにインデックスを追加する

  • accessesテーブルのdateカラムにインデックスを追加する  bundle exec rails generate migration add_date_index_to_accesses
  • マイグレーションファイルを編集する
    class AddDateIndexToAccesses < ActiveRecord::Migration
      def change
        add_index :accesses, :date
      end
    end
    

テーブルにMySQLのLONGTEXTカラムを追加する

カラムのデフォルト値を設定する

  • migrationファイル中でadd_columnした後、updateなどでデフォルト値を設定したい場合、reset_column_informationが必要っぽい。
        add_index :feeds, :folder_id
        Feed.reset_column_information
        #フィードのfolder_idのデフォルト設定
        Feed.where(:feed_provider_id => 1).update_all(:folder_id => 999)
    

モデルファイル込みで生成

  • bundle exec rails g model モデル名 カラム定義…で生成する。
    bundle exec rails g model product name:string price:integer

モデルコントローラービュー込みで生成

  • bundle exec rails g scaffold モデル名 カラム定義…で生成する。
    bundle exec rails g scaffold product name:string price:integer

マイグレーションファイルのバージョン指定

マイグレーションファイルの削除

  • railsのrakeで作成したmigrationファイルとstatus履歴を削除する – joppot
  • 一度作成したけど不要になった場合。
  • 以下のコマンドで削除する。up状態で実行してもうまくいく?
    bundle exec rails destroy migration マイグレーションクラス名
    bundle exec rails destroy migration マイグレーションファイル名(create_index_entriesとか)
  • もしくはrollbackしてdown状態で手動でマイグレーションファイルを削除すればいいらしい。

マイグレーション実行

通常実行

  • マイグレーション実行。何も指定しないとdevelopment環境が更新される。
    bundle exec rake db:migrate

環境を指定して実行

  • production環境を更新したい場合
    bundle exec rake db:migrate RAILS_ENV=production

戻す

  • rollbackを指定する
    bundle exec rake db:rollback

マイグレーションを再実行

  • DB削除、DB作成、マイグレーションを全部実行する。
    bundle exec rake db:migrate:reset
  • 現在のスキーマに基いて実行したい場合は以下のコマンド。
    bundle exec rake db:reset

現在の状態に基いてテーブルを作り直したい場合「db:reset」じゃないとだめ。手作業でテーブル定義を修正していてマイグレーションファイルが不完全な場合、db:resetじゃないとおかしなことになる。DBをリセットするrakeタスク二つ - maeshimaの日記

マイグレーションをスキップ

手順

  • マイグレーションの番号を取得。downとなっているのが適用されていないものなのでそこからスキップしたい番号を選択する。
    bundle exec rake db:migrate:status
  • sqlを実行する
    INSERT INTO schema_migrations (version) VALUES(20131031113857);

schema.rbの作成

  • 現在のDBからschema.rbを作成したい場合
    bundle exec rake db:schema:dump

状態確認

マイグレーションの適用状態を確認する

  • db:migrate:statusで現在の状態を確認できる。Statusがupのところが実行済みのもの。
    $ bundle exec rake  db:migrate:status
    
     Status   Migration ID    Migration Name
    --------------------------------------------------
       up     20140927082920  Create books
       up     20140927084708  Create hoges
       up     20141121060148  Create software infos
       down    20150409052819  Create settings
    
  • db:versionで現在どこまで進んでいるかを確認できる。
    $ bundle exec rake  db:version
    Current version: 20141121060148
    

現在のdbバージョンを確認する

  • db:versionで確認できる。
    Current version: 20141208044134

Tips

マイグレーションファイルをまとめる

  • Railsのマイグレーションファイルを既存のスキーマ、データベースを元に作成|WEBデザイン Tipsで説明されている手法が使えるかも。
  • schema.rbとデータベースの内容が食い違っていて、schema.rbが正しい場合以下を実行してデータベースを更新する
    bundle exec rake db:schema:load
  • 既存のデータベースからschema.rbを生成
    bundle exec rake db:schema:dump
  • マイグレーションファイルの作成。マイグレーションファイルにschema.rbの内容を反映しておく。
    bundle exec rails g migration create_tables
  • マイグレーション実行
    bundle exec rake db:migrate

※schema:dumpだとテーブルの情報が一部抜け落ちてしまう場合があるので、手動マイグレーションファイルを保存しておいたほうが安全だと思う(MySQLの場合全文検索テーブルの指定とかFT4)。

トラブルシューティング

migrationの状態を確認したらNO FILEと表示された

  • 該当するマイグレーションファイルが存在しない場合「rake db:migrate:status」でNO FILEと表示されてしまう。
  • この場合該当するダミーマイグレーションファイルを以下の内容で作成し(例: 999がNO_FILEのIDの場合、999_tmp.rb)。
    class Tmp < ActiveRecord::Migration
      def change
      end
    end
    
  • down状態に変更
    bundle exec rake db:migrate:down VERSION=999
  • 999_tmp.rbを削除する。

MyISAMテーブルがschema.rbに反映されない

  • どうやら仕様らしい。
  • schema.rbだけに頼らず、マイグレーションファイルを一つにまとめ、全部のテーブルを生成するマイグレーションファイルをメンテしておいたほうがよいかも。
  • もしくはschema.rbのかわりにsqlとして管理する方法もあるらしい。

Rails 5でbundle exec rake db:resetでエラー

  • 本番か今日から取り込んだデータで以下のコマンドを実行すると「ActiveRecord::ProtectedEnvironmentError」が表示される。
     RAILS_ENV=development bundle exec rake db:reset
  • Rails 5だと情報がテーブルに保存されていてそれが原因らしい。Rails5のproductionでrake db:dropはできない、普通には - Qiita
  • 以下のコマンドで設定する。
    bundle exec rails db:environment:set RAILS_ENV=development
    RAILS_ENV=development bundle exec rake db:reset

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-02-11 (月) 17:40:22 (10d)