Migration by using jdbc

JRuby on Rails

マイグレーションを行う前に、http://www.headius.com/jrubywiki/index.php/JRuby_on_Rails を見ながら動かしてみる。

  1. ファイアウォールがあるなら, 環境変数HTTP_PROXYを設定? ("http://${http-proxy-host}:${http-proxy-port}/" っていうフォーマット)
  2. $JRUBY_HOME/bin/gem install rails -y --no-ri --no-rdoc を実行(すでに上で実行してあるからパス)
  3. jruby $JRUBY_HOME/bin/rails を実行してrailsのアプリを生成(すでにアプリがあるのでそれを使うのでパス)
  4. そのアプリにcdして、jruby script/server でサーバーを起動。

これで、ブラウザから動作を確認できました。

script/console in JRuby on Rails

再度、http://jruby-extras.rubyforge.org/ActiveRecord-JDBC/ を開いて、今度はInside Railsを見ながらTry

1. ActiveRecord-JDBCのインストール。これは上でやっているのでパス。
2. 一回だけ実行する設定を config/environment.rb に追加。追加する場所は Rails::Initializer の直前。

...
require File.join(File.dirname(__FILE__), 'boot')

require 'rubygems'
gem 'ActiveRecord-JDBC'
require 'jdbc_adapter'

Rails::Initializer.run do |config|
...

3. database.yml をJDBCアダプタを使うように設定。ドライバのクラス名とURLが必要っす。

migration_source:
  adapter: jdbc
  driver: org.hsqldb.jdbcDriver
  url: jdbc:hsqldb:hsql://localhost/
  username: sa


これで動くはずなんだけど、とりあえずjrubyでscript/consoleを動かして確認します。
1. CLASSPATHにJDBCドライバのパスあるか確認。
2. jruby script/consoleを起動
3.JDBCで接続しているマイグレーション元のテーブルをマッピングするモデルを定義

>> class AppUser < ActiveRecord::Base
>>   establish_connection "migration_source"
>>   set_primary_key 'app_user_id'
>>   set_table_name 'app_user'
>> end
>> => nil

4. findしてデータが取れるかどうかを確認

AppUser.find(:all, :limit => 5)

でデータがゲットできていればOKです。


あとは上で定義したようなモデルを使ってマイグレーション先にデータをコピーするようなマイグレーションを書いてあげれば、JDBCでしか接続できないDBから他のDBへの移行が実現できます。