「RailsによるアジャイルWebアプリケーション開発」16章まで読了
しばらく書評三昧でしたが、ようやく一段落したので再開します。
schema_infoテーブル
マイグレーションのバージョン管理は、このテーブルがやってたんですね。
どういう構造かと覗いてみると、、
.schema schema_info CREATE TABLE schema_info (version integer);
バージョンしかないじゃん!
なんかわざわざDBのテーブルにしなくても良いような。。
rake db:migrate VERSION=xx
ってやると、このschema_infoのversionと比較して、xxまで上げたり下げたりしてくれるそうな。
マイグレーションとデータベース列の型
マイグレーションで指定する型って、:stringとか、:integerとか、Rails内の論理型なのですが、これを実際のデータベースの型にマッピングする必要があります。
本には各DB(db2/mysql/openbase/oracle/postgresql/sqlite/sqlserver/sybase)のマッピングが載っているのですが、状況も変わることでしょうし、最新の情報はどこかいなとソースを読んでみることに。
ありました。InstantRailsの場合は、
InsRails/ruby/lib/ruby/gems/1.8/gems/activerecord-2.0.2/lib/active_record/connection_adapters
の例えば、sqliteの場合はsqlite_adapter.rbで、この部分です。
def native_database_types #:nodoc: { :primary_key => default_primary_key_type, :string => { :name => "varchar", :limit => 255 }, :text => { :name => "text" }, :integer => { :name => "integer" }, :float => { :name => "float" }, :decimal => { :name => "decimal" }, :datetime => { :name => "datetime" }, :timestamp => { :name => "datetime" }, :time => { :name => "datetime" }, :date => { :name => "date" }, :binary => { :name => "blob" }, :boolean => { :name => "boolean" } } end
これでデータベースごとにどの型を使えば良いか分かりますね。
ちなみにJavaの場合は、SQL型っていう概念を導入してて、
データベースの型 <-> SQL型 <-> 言語の型
という風にマッピングしていたりするようです。
http://java.sun.com/javase/6/docs/technotes/guides/jdbc/getstart/mapping.html#997737
ActiveRecord::IrreversibleMigration
非互換なマイグレーション(ある列を数値から文字列に変える場合など)を書くときに、元に戻れないことを明示するためにdownメソッドにこの例外をスローするように記述する。
試しに、upメソッドでActiveRecord::IrreversibleMigrationをraiseするよう書いてみました。(まったく意味はありません)
まずはmigrationの作成
>ruby script/generate migration test ruby script/generate migration test exists db/migrate create db/migrate/009_test.rb
中身はこんな感じ
class Test < ActiveRecord::Migration def self.up raise ActiveRecord::IrreversibleMigration end def self.down end end
で、早速マイグレートしてみる。
>rake db:migrate rake db:migrate rake aborted! Test is not a class (See full trace by running task with --trace) (in /InsRails/rails_apps/depot) >
が、なんか違うような。。
マイグレーション作るのに、testっていう名前は使っちゃダメなのか?
じゃあってんで、違う名前で作ってみる。(ちなみに009_test.rbは削除した)
>ruby script/generate migration irreversible ruby script/generate migration irreversible exists db/migrate create db/migrate/009_irreversible.rb
中身はさっきとほぼ同じ。
class Irreversible < ActiveRecord::Migration def self.up raise ActiveRecord::IrreversibleMigration end def self.down end end
>rake db:migrate rake db:migrate (in /InsRails/rails_apps/depot) == 9 Irreversible: migrating ================================================== rake aborted! ActiveRecord::IrreversibleMigration (See full trace by running task with --trace) >
今度はうまくいったらしい。(実験としてはね)
マイグレーションによるデータのロード
かつて開発者は、それらのデータ(マスタデータ)をデータベースに取り込むために、たいていは手作業でSQLのinsert文を打ち込んでいました。これでは管理が困難な上に、再現性がほとんどありません。
ほんとそうなんですよね。いまうちの現場では、個人ごとの環境ってのはなくて、共用環境しかないのですが、テストの都合でマスタを変えられてしまうこともあり、思うようにテストが出来なかったり、そもそも何が正しいのか分からなかったりします。
マイグレーションとして管理されていれば安心ですね。
annotate_modelsプラグイン
modelクラスに
== Schema Information # Schema version: 8 # # Table name: orders # # id :integer not null, primary key # name :string(255) # address :text # email :string(255) # created_at :datetime # updated_at :datetime # payment_type_id :integer # class Order < ActiveRecord::Base
のようなスキーマ情報のコメントを挿入してくれるプラグインだそうです。
本に載ってる方法でプラグインのインストールを試みたものの、
Plugin not found: ["http://repo.pragprog.com/public/plugins/annotate_models"]
で怒られてしまったので、
http://www13.atwiki.jp/maimuzo/pages/41.html
を参考にさせてもらいました。
無事、上記のような形でコメントが挿入されました。
まあ、嬉しいっちゃ嬉しいかもなあ的な機能かも。
ちなみに、
http://blog.s21g.com/articles/318
では、indexの情報も出力してくれる強化版(?)が配布されているようです。