GAE+PHP/Rubyで拓く新世界

第5回 GAE+SQL4GでRailsアプリを開発してみよう

萩原 巧
リトルソフト株式会社

中越 智哉
株式会社ナレッジエックス

2010/4/12

Google App EngineはそのままではRDBが使えません。しかし、JDBCアダプタ経由でSQL4Gを利用すれば、通常のRailsアプリ同様にActiveRecordからBigTableにアクセスできるようになります(編集部)

JRubyについて

 本連載の第3回では、GAE+SQL4G+Railsの環境設定手順をご説明しました。第3回は手順だけを駆け足で説明した形になってしまいましたので、ここで改めてインストールしたものについておさらいしたのち、Scaffoldなどを使ったもう少し大きなアプリを作成してみたいと思います。

 本連載ではGAE上でRailsを実行するためにJRubyを利用しています。JRubyはJavaVM上でRubyを実行することができる環境です。Google App Engine(GAE)はPythonとJavaの2つをサポートしていますが、GAE for JavaではJRubyが動くため、JRuby上でRuby on Railsを動作させることも可能です(JRuby on Railsとも呼ばれます)。

 GAE上で動作させるだけであれば必ずしもローカル環境にJRubyは不要と思われますが、ローカル環境で作成したアプリの動作を確認するためにはローカル環境にJRubyをインストールしておく必要があります。

 JRubyや、その上で動作するJRuby on Railsについての詳細は、下記の記事もご参照ください。

関連リンク:
リンク JRuby(@IT リッチクライアント用語辞典)
http://www.atmarkit.co.jp/aig/07wcr/jruby.html
リンク Aptana RadRailsで始めるJRuby on Rails超入門
http://www.atmarkit.co.jp/fjava/special/jruby01/jruby01_1.html
リンク Ruby on RailsやJava EE開発に便利なNetBeans
http://www.atmarkit.co.jp/fjava/special/netbeans6_02/netbeans6_02_1.html

 ローカルでのJRuby利用の際の注意点として、CRuby(ネイティブのRuby環境)との共存でgemを別にしたほうが良い、ということがあります。特に設定をしない限り、CRubyとJRubyではgemの管理が共通化されません。CRubyとJRubyの両方を入れている場合、CRuby側でインストールしたgemはJRubyでは認識されません。そのため両方の環境で同じgemを利用したい場合は、双方でgemコマンドを利用してそれぞれに同じgemをインストールする必要があります。環境変数を適切に設定することで両者のgemを同一の場所で管理することも可能ですが、すべてのgemについて互換性があるわけではありませんので、本連載ではCRubyとJRubyのgemの格納場所は共通化しない前提で説明しています。

 CRubyにgemをインストールする場合は、

$ sudo gem install [gemの名称]

 JRubyにgemをインストールする場合は

$ jruby -S gem install [gemの名称]

とします。

ActiveRecordとSQL4Gの連携

 さらに、JRuby上でRuby on Railsを動作させる場合、専用のgem(JDBCアダプタ)をインストールすることで、ActiveRecordからのデータベース接続の手段としてJDBC接続を利用することも可能です。本連載のキーとなるSQL4GはH2 Databaseをエンハンスしたプロダクトで、実際のデータの格納はBigTableに対して行っていますが、外部からは通常のH2 Databaseとなんら変わりなく振る舞うように作られています。そのためJRuby上でRuby on Railsを稼働し、ActiveRecordからはJDBCアダプタを経由してH2 Database(と同じように振る舞うSQL4G)に接続することができるのです。

構成図

 今回インストールしているactiverecord-jdbch2-adapterは、上記にあるようにActiveRecordからJDBCを経由してH2 Databaseに接続するJDBCアダプタです。activerecord-jdbch2-adapterとともにインストールされるgemは以下のとおりです。

  • activerecord-jdbc-adapter
  • jdbc-h2

 これらのgemがインストールされると、database.ymlにJDBC接続用の設定が記述できるようになります。下記のリストで「adapter: jdbc」がJDBC接続であること(JDBCアダプタを利用して接続する)を示しています。ほかの項目については、Javaプログラマならおなじみの設定かと思います。「driver」にはSQL4Gのドライバクラス「jp.littlesoft.sql4g.Driver」を指定します。「url」にはデータベース名を、「user」「password」にはH2 Databaseのデフォルトの接続ユーザー名とパスワードを指定します。

●database.yml
development:
  adapter: jdbc
  driver: jp.littlesoft.sql4g.Driver
  url: mydb
  username: sa
  password:

production:
  adapter: jdbc
  driver: jp.littlesoft.sql4g.Driver
  url: mydb
  username: sa
  password:

 上記の設定ではデータベース名が「mydb」となっていますが、SQL4Gで利用するデータベースはenvironment.rbにて作成しています。

●environment.rbの一部抜粋
  # Skip these so generators can run from MRI
  if defined? JRUBY_VERSION
    # Use DataMapper to access datastore
    require 'rails_dm_datastore'
    # Set Logger from appengine-apis, all environments
    require 'appengine-apis/logger'
    config.logger = AppEngine::Logger.new
    # Skip frameworks you're not going to use.
    # :active_recordを外す
    config.frameworks -= [ :active_resource, :action_mailer ] 
    # SQL4Gでデータベースを作成
    require 'java'
    Java::JpLittlesoftSql4g.GAdministrator.new("mydb#0", "sa", "", true) rescue nil
  end

 上記の「Java::JpLittlesoftSql4g.GAdministrator.new("mydb#0", "sa", "", true) rescue nil」がSQL4G上にデータベースを作成するコードです。

 SQL4Gではjp.littlesoft.sql4g.GAdministratorクラスのインスタンスを生成する際の引数の指定によって、データベースを作成することができます。コンストラクタの第1引数から第3引数がそれぞれデータベース名、ユーザー名、パスワードを示しており、第4引数のtrueはデータベースを作成するか否かを示しています。

 JRubyでRubyコードからJavaコードを実行する場合、「require 'java'」が必要で、実行したいJavaコードには「Java::」に続いてパッケージ名を「.」で区切る代わりに各ワードの先頭を大文字にして連結し、「.」で区切ってクラス名、メソッド名を記述します。Javaのインスタンス生成はRubyではnewメソッドに相当するため、上記のように記述しています。また、environment.rbが再度実行された場合、GAdministratorクラスのコンストラクタでデータベースを再度生成しようとすると例外が発生してしまうため、「rescue nil」を付けてあります。

 
1/3
next

Index
GAE+SQL4GでRailsアプリを開発してみよう
  Page1
JRubyについて
ActiveRecordとSQL4Gの連携
  Page2
google-appengine gemについて
セットアップスクリプト(rails2_appengine.rb)について
Rails+SQL4Gでのマイグレーション
Rails+SQL4Gでアプリケーションを開発してみる
  Page3
JRuby on Rails環境(非GAE)での動作確認
GAE環境での動作確認
マイグレーションの代替コントローラを作る
本番環境にデプロイ、しかし……

index GAE+PHP/Rubyで拓く新世界

 Coding Edgeお勧め記事
いまさらアルゴリズムを学ぶ意味
コーディングに役立つ! アルゴリズムの基本(1)
 コンピュータに「3の倍数と3の付く数字」を判断させるにはどうしたらいいか。発想力を鍛えよう
Zope 3の魅力に迫る
Zope 3とは何ぞや?(1)
 Pythonで書かれたWebアプリケーションフレームワーク「Zope 3」。ほかのソフトウェアとは一体何が違っているのか?
貧弱環境プログラミングのススメ
柴田 淳のコーディング天国
 高性能なIT機器に囲まれた環境でコンピュータの動作原理に触れることは可能だろうか。貧弱なPC上にビットマップの直線をどうやって引く?
Haskellプログラミングの楽しみ方
のんびりHaskell(1)
 関数型言語に分類されるHaskell。C言語などの手続き型言語とまったく異なるプログラミングの世界に踏み出してみよう
ちょっと変わったLisp入門
Gaucheでメタプログラミング(1)
 Lispの一種であるScheme。いくつかある処理系の中でも気軽にスクリプトを書けるGaucheでLispの世界を体験してみよう
  Coding Edgeフォーラムフィード  2.01.00.91


Coding Edge フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

>

Coding Edge 記事ランキング

本日 月間