&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するしかない? **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