- 追加された行はこの色です。
- 削除された行はこの色です。
#author("2016-05-25T15:36:17+09:00","default:wikiwriter","wikiwriter")
&tag(マイグレーション);
*目次 [#v5671532]
#contents
*関連ページ [#dd30858c]
-[[Rails]]
*参考情報 [#f8d1da54]
*マイグレーションファイルの単体作成 [#t8235a17]
- 「rails generate migration マイグレーション名」で生成可能。[[NAMAKESUGI |[Rails4] migrationコマンドまとめ:http://namakesugi.blog42.fc2.com/blog-entry-157.html]]
- createから始めたらcreate table、addから始めたらカラムの追加、removeから始めたらカラムの削除用のテンプレートを自動で作ってくれる。
-[[Rails4のマイグレーションの書き方まとめ | @cyber_yoshida:http://hyoshida.github.io/2014/12/27/writting-a-migration-in-rails-4.html]]によると、"change"にまとめる方向になっていて、"self.up"や"self.down"はなくなりインスタンスメソッドの"up"や"down"に変更されている。
-属性を変更する場合やカラムを削除する場合はchangeでreversibleを使って記述するか、インスタンスメソッドのup、downに記述する
** テーブル生成 [#t4d00d54]
-booksテーブルを生成する場合以下のコマンドを実行する。
bundle exec rails generate migration create_books
-ファイルを書き換える
#pre{{
class CreateHoges < ActiveRecord::Migration
def change
create_table :hoges do |t|
t.string :name
t.integer :age
t.timestamps
end
end
end
}}
** テーブルに文字列カラムを追加する [#ib05cf4e]
-booksテーブルにimageカラム(文字列)を追加する
bundle exec rails generate migration add_image_to_books
-ファイルを書き換える
#pre{{
class AddImageToBooks < ActiveRecord::Migration
def change
add_column :books, :image, :string
end
end
}}
**テーブルの型を変更する [#b9abd1d6]
-booksテーブルのtitleをstringからtextに変更する
bundle exec rails generate migration change_title_type_of_books
-マイグレーションファイルを編集する
#pre{{
class ChangeTitleTypeOfBooks < ActiveRecord::Migration
def change
change_column :books, :title, :text
end
end
}}
**テーブルにインデックスを追加する [#zf93952a]
-accessesテーブルのdateカラムにインデックスを追加する
bundle exec rails generate migration add_date_index_to_accesses
-マイグレーションファイルを編集する
#pre{{
class AddDateIndexToAccesses < ActiveRecord::Migration
def change
add_index :accesses, :date
end
end
}}
** テーブルにMySQLのLONGTEXTカラムを追加する [#d856bcf4]
-":text"だけだとLONGTEXTにならない。, :limitが必要。[[コチョナナバ: railsでmysqlのlongtext型を使う:http://kingyo-bachi.blogspot.jp/2013/06/railsmysqllongtext.html]]
#pre{{
class AddDescriptionToBooks < ActiveRecord::Migration
def change
add_column :books :description, :text, :limit => 4294967295
end
end
}}
*モデルファイル込みで生成 [#s3b2da4d]
-bundle exec rails g model モデル名 カラム定義…で生成する。
bundle exec rails g model product name:string price:integer
*モデルコントローラービュー込みで生成 [#h16f3094]
-bundle exec rails g scaffold モデル名 カラム定義…で生成する。
bundle exec rails g scaffold product name:string price:integer
*実行 [#be4a52be]
**通常実行 [#n1cd69c5]
-マイグレーション実行。何も指定しないとdevelopment環境が更新される。
bundle exec rake db:migrate
**環境を指定して実行 [#p7792130]
-production環境を更新したい場合
bundle exec rake db:migrate RAILS_ENV=production
**戻す [#r50b0142]
-rollbackを指定する
bundle exec rake db:rollback
**マイグレーションを再実行 [#u613f246]
-DB削除、DB作成、マイグレーションを全部実行する。
bundle exec rake db:migrate:reset
-現在のスキーマに基いて実行したい場合は以下のコマンド。
bundle exec rake db:reset
現在の状態に基いてテーブルを作り直したい場合「db:reset」じゃないとだめ。手作業でテーブル定義を修正していてマイグレーションファイルが不完全な場合、db:resetじゃないとおかしなことになる。[[DBをリセットするrakeタスク二つ - maeshimaの日記:http://maeshima.hateblo.jp/entry/20100412/1271058806]]
**マイグレーションをスキップ [#zbd4e94b]
-Pending状態になっているマイグレーションファイルをスキップしたい場合がある。
-[[ruby on rails - How do you skip failed migrations? (rake db:migrate) - Stack Overflow:http://stackoverflow.com/questions/8810732/how-do-you-skip-failed-migrations-rake-dbmigrate]]によると、専用のインターフェイスは存在せず、schema_migrationsテーブルにスキップしたいマイグレーションファイルの数字をINSERTするしかない?
-[[Railsでマイグレーションを介さずにサーバーでDBを変更してしまったとき - PILOG:http://xoyip.hatenablog.com/entry/2014/07/07/203000]]でも同様。
手順
-マイグレーションの番号を取得。downとなっているのが適用されていないものなのでそこからスキップしたい番号を選択する。
bundle exec rake db:migrate:status
-sqlを実行する
INSERT INTO schema_migrations (version) VALUES(20131031113857);
**schema.rbの作成 [#i0c9e9ac]
-現在のDBからschema.rbを作成したい場合
bundle exec rake db:schema:dump
*状態確認 [#scebff42]
**マイグレーションの適用状態を確認する [#c6592d1b]
-db:migrate:statusで現在の状態を確認できる。Statusがupのところが実行済みのもの。
#pre{{
$ 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で現在どこまで進んでいるかを確認できる。
#pre{{
$ bundle exec rake db:version
Current version: 20141121060148
}}
**現在のdbバージョンを確認する [#p9b4f5c9]
-db:versionで確認できる。
Current version: 20141208044134
*Tips [#h76d2731]
**マイグレーションファイルをまとめる [#rabcdba9]
-[[Railsのマイグレーションファイルを既存のスキーマ、データベースを元に作成|WEBデザイン Tips:http://blog.digital-squad.net/article/398190260.html]]で説明されている手法が使えるかも。
-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)。
*トラブルシューティング [#e7bf77ea]
** migrationの状態を確認したらNO FILEと表示された [#cb916a47]
-該当するマイグレーションファイルが存在しない場合「rake db:migrate:status」でNO FILEと表示されてしまう。
-この場合該当するダミーマイグレーションファイルを以下の内容で作成し(例: 999がNO_FILEのIDの場合、999_tmp.rb)。
#pre{{
class Tmp < ActiveRecord::Migration
def change
end
end
}}
-down状態に変更
bundle exec rake db:migrate:down VERSION=999
-999_tmp.rbを削除する。
**MyISAMテーブルがschema.rbに反映されない [#k9bc12fa]
-どうやら仕様らしい。
-schema.rbだけに頼らず、マイグレーションファイルを一つにまとめ、全部のテーブルを生成するマイグレーションファイルをメンテしておいたほうがよいかも。
-もしくはschema.rbのかわりにsqlとして管理する方法もあるらしい。