ITコンサルの日常

ITコンサル会社に勤務する普通のITエンジニアの日常です。

「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の情報も出力してくれる強化版(?)が配布されているようです。