migration初体験04【migrationファイルを使ってDBを変更】
長引いてしまってすっかり忘れてもうたのですが、何のカラムを追加したかったかというと、価格カラムと、作者の性別カラムを加えたかったのでした。
価格カラムは、整数型・デフォルト値 0・nullは許さない
作者の性別カラムは、文字列型(1)・デフォルト値 m・nullは許さない
にしたいと思います。
それから作者の性別は、m が男を、f が女を画面上で表すようにしたいです。
というわけで、migration ファイルに追加する行は、みようみまねで、
t.column "price", :integer, :default => 0, :null => false
t.column "gender", :string, :limit => 1, :default => "m", :null => false
でしょうね。おそらくは。(勘でやってしまえそうなところが rails のスゴいところかもしれません)
そんな訳で、新しくなった migration ファイルは
class NewColumnsOnBooks < ActiveRecord::Migration
def self.up
create_table "books", :force => true do |t|
t.column "title", :string, :limit => 400, :default => "(no title)", :null => false
t.column "author", :string, :limit => 500, :default => "(no author)", :null => false
t.column "price", :integer, :default => 0, :null => false
t.column "gender", :string, :limit => 1, :default => "m", :null => false
end
end
def self.down
end
end
となりました。あとは、
# rake migrate
と入力してみましょう。
== NewColumnsOnBooks: migrating ===============================================
-- create_table("books", {:force=>true})
-> 0.1523s
== NewColumnsOnBooks: migrated (0.1579s) ======================================
The rake task migrate has been deprecated, please use the replacement version db:migrate
と、またエラーがでました。がくりくりくり。
コマンドがナウくないらしいので、いわれた通りにコマンドを打ち直します。
# rake db:migrate
はい、なんのメッセージも表示されないで、終了しました。何が起きたかわかんないよー。
でも、booksテーブルを確認したら、priceカラムとgenderカラムが増えていました。
そして、schema_infoというテーブルも増えていました。
これは、rake db:migrate のバージョンが今なんだろうか、という管理をするテーブルだそうです。
しかしここで大問題発生!!booksテーブルに入っていたデータがすべて消えました。がくりくりくり。
どうやら、migration ファイルに入っていた記述 :force => true のせいのようです。
では、データを消さずに migration するには、どうしたらいいか、というと、add_column っつーのを使えばいいそうです。
その場合の migration ファイルの中身は、こんな感じ↓になると思います。
class NewColumnsOnBooks < ActiveRecord::Migration
def self.up
add_column "books", "price", :integer, :default => 0, :null => false
add_column "books", "gender", :string, :limit => 1, :default => "m", :null => false
end
def self.down
end
end
遠回りをしてしまったようですが、まあ、落ち着くべきところに落ち着いたという感じですか。
で、ど素人の私は、rake migrate をすると、追加したカラムの分だけ画面表示も勝手に変えてくれると思ったのですが、そうは問屋がおろさない、というわけで、手動で画面とか model とかを直さなくてはならないです。
というのは次回にやりたいと思います。
【広告】