不定期更新雑記

[Rails] Ruby on RailsでOracleを利用

Pocket

とある理由から、後述の環境で「Ruby on Railsを使ってOracle Databaseにアクセスする」という(今の私にとっては)難易度の高いことを要求されています。1
その悪戦苦闘ぶりを記していきます。

 1. 想定環境について
 2. 仮想環境(CentOS 6.4)を準備
  2.1 CentOS 6.4をインストール
  2.2 Ruby環境の準備
 3. RubyからOracleへ接続
  3.1 Oracle Instant Clientをインストール
  3.2 ruby-oci8をインストール
  3.3 RubyからOracleへクエリ発行
 4. Ruby on RailsからOracleへ接続
  4.1 Oracle enhanced adapter for ActiveRecordをインストール
  4.2 Oracleハンズオン・ラボの情報を利用してRailsアプリを作成
 5. 外部DB(複合主キー,数値以外のキー)にアクセスする
  5.1 複合主キーへの対応
  5.2 数値以外のキーへの対応(未検証)
 6. まとめ?

1. 想定環境について

後輩から渡されたメモによると、下記の環境で苦戦している模様。

OS: CentOS 6.4
ruby: 1.9.2
gem: 2.0.3
rails: 3.2.13
OracleDB: 11g R2

2. 仮想環境(CentOS 6.4)を準備

ひとまず、上記の環境を手元に用意しないと検証もできないので、VMwere Playerを使ってCentOS 6.4の環境準備を行います。
(Oracle 11gは、既に手元に検証環境があったので準備手順は割愛します)

2.1 CentOS 6.4をインストール

下記のページから CentOS 6.4 のDVDイメージファイル(CentOS-6.4-i386-bin-DVD1.iso)をダウンロードします。
http://ftp.riken.jp/Linux/centos/6.4/isos/i386/

VMware Playerで新規仮想マシンを作成します。
(今回は簡易インストール機能を利用しないようにするため、「後でOSをインストール」を選択)

ハードウェア構成は、CPU 2コア、メモリ 4GB ぐらいにしておけば支障ないですよね。
(想定しているサーバがどんなスペックなのか知りません…)

さて、CentOS 6.4のインストールに進みます。
ただ、以降の設定は特別なことはしていません。というより、“特別なことはしない”という意識で臨みました。
そして、本来は「Basic Server」として構築すべきでしょうが、GUIの方が何かと使い勝手がいいので、「Desktop」としてインストールします。

基本的なデスクトップとしてセットアップが完了したら、ひとまず CentOS 6.4 のインストールは完了です。
(おそらくパッケージが不足していると思いますが、必要になったときにインストールします)

CentOS 6.4 インストール後

CentOS 6.4 を使うのは初めてですが、何とかなりました。2

2.2 Ruby環境の準備

想定環境にある環境にまでセットアップしていきます。

下記のWebページを参考にして ruby, gem, rails のセットアップをしてみます。
CentOS 6.2 に RVM、Ruby、Ruby on Rails をインストール – あるSEのつぶやき

実行したコマンドをつらつらと書いておきます。

RVMを使ってrubyをインストール

ターゲット(ruby 1.9.2)を捕捉。

ruby 1.9.2 のインストールと同時に gem がインストールされたようです。

何やら gem 2.0.3 ではなく gem 2.0.7 がインストールされた模様。
想定環境と違うので、gem 2.0.3 をインストールしておきます。3

次は Ruby on Rails のインストール。

これでようやく想定環境が構築できました。

3. RubyからOracleへ接続

想定環境が準備できたので、次はOracleへの接続です。

下記Webページを参考にして、Oracie Instant Client と ruby-oci8 をインストールします。
http://ruby-oci8.rubyforge.org/ja/InstallForInstantClient.html

3.1 Oracle Instant Clientをインストール

Oracle Technology Network から下記2つのファイルをダウンロードします。4

“Instant Client Package – Basic”
 oracle-instantclient11.2-basic-11.2.0.3.0-1.i386.rpm
“Instant Client Package – SDK”
 oracle-instantclient11.2-devel-11.2.0.3.0-1.i386.rpm

Instant Clientをインストールして、環境変数を設定します。

4行目の文字コード指定は、接続先のOracleデータベースの文字コードにあわせて設定する必要があります。5
下記のSQLを実行することで「NLS_CHARACTERSET」の設定値が確認できます。

3.2 ruby-oci8をインストール

rubyforgeから ruby-oci8-2.1.5.tar.gz をダウンロードしてインストールします。

3.3 RubyからOracleへクエリ発行

準備が整ったので、RubyからOracleデータベースに接続するテストをしてみます。

上記のコマンドを実行すると、TEST_001テーブルのデータ全件が CSV形式(カンマ区切り)で出力されます。
上記のコマンドと同じようにSQL*Plusを使ってクエリを発行すると下記のようになります。

これでrubyからOracleへ接続できることは確認できましたね。

4. Ruby on RailsからOracleへ接続

さて、本題でもある「Ruby on RailsでOracleを利用」するために、MySQLやSQLiteなどのようにRailsからOracleに接続できるようにしてみます。

※ここからは私の知らない世界(=Railsって何?っていう知識レベル)なので、解説とかは無理かもです…

4.1 Oracle enhanced adapter for ActiveRecordをインストール

RailsからOracleへ接続するためには、「Oracle enhanced adapter for ActiveRecord」というアダプターが必要らしいです。
何も疑いもせずに、素直にインストールしてみます。

4.2 Oracleハンズオン・ラボの情報を利用してRailsアプリを作成

下記のWebページにある「OracleおよびRuby on Railsの使用」というハンズオン・ラボの情報が役立つかも?ということで参考にしながらアプリを作ってみます。
(目標:OracleデータベースのテーブルをRailsから操作する)
http://www.oracle.com/webfolder/technetwork/jp/obe/db/11g/r2/prod/appdev/opensrclang/rubyrails/rubyrails.htm

Railsアプリケーションを作成

データベース接続情報(config/database.yml)を修正

モデルを生成…しようとしたらエラーになりました。

少しGoogleで検索してみたところ、下記のWebページが見つかりました。
http://kiyotakagoto.hatenablog.com/entry/2013/05/28/235727
Gemfile内の下記のコメントアウトを外すとイイみたいです。

リトライしてみると…今度は違うエラーが出てきました。

oracle_enhanced adapter が無いって言いたいのは分かりました。
そして、私が見落としていた情報がありました。
https://github.com/rsim/oracle-enhanced
上記Webページに、書いてあることをやっていませんでした。
Gemfile内に下記の記述を追記してやる必要があるようです。

さて、3度目の正直なるか!

無事にモデル生成まで進めました。(ここに至るまでに時間がかかりすぎました…)

その後、Oracleデータベースにテーブルを生成など、エラーもなく順調に進みました。6

これで、OracleデータベースのテーブルをRailsから操作することができました。
ただ、今回試したのは、Railsのルールに則ったテーブル作成・操作でした。
次は、Railsのルールに反することの実装に挑戦します。

5. 外部DB(複合主キー,数値以外のキー)にアクセスする

後輩がRailsについて調べていて絶望していたのがこのテーマ。
Rails単独利用のWebアプリケーションであれば、Railsのルールに則り「主キーは、数値型の”id”のみ」で実装できるかもしれませんが、本件で対応すべきOracleDBのテーブルは

  • 複合主キー構成
  • 数値以外が主キーとなりうる

という設計になっているため、何か手を打つ必要がありそうです。

5.1 複合主キーへの対応

composite_primary_keys というものを使えば複合主キーにも対応できそうなので、早速インストールしてみます。

Rubyのバージョンが 1.9.3 以降でないとダメみたいですね。
…というわけで、Rubyを1.9.2から1.9.3に変えてみます。

Rubyを1.9.3に変えて、リトライ。

無事にインストール完了です。
そして、Gemfileに下記内容を追記。

例えば、List というモデルが
key1: integer, key2: integer, key3: integer という主キー構成のLISTSテーブルを利用する場合、下記のようになるようです。

5.2 数値以外のキーへの対応(未検証)

デフォルトでは “id”という代理キー(人口キー?)が主キーになります。
その”id”を文字列にする方法があるみたいなのですが、今回の 外部DBへのアクセス という意味では、何の対応も要らないような気がしています。

※要検証…?

MySQLやSQLiteを使いながら、主キーを文字列型に というテーマは、Ruby on Railsの知識がほぼ無い今の私には困難なので、ひとまず逃げておきます。7

6. まとめ?

今回の課題がすべて解決♪とは言い切れない感じの整理結果となりました。

まず、Oracleへの接続について。
これは、Oracleの知識8 があったので、なんとかなりました。
それでも、いろいろと検証しようとすると、Rubyの知識が必要になってきますね。やっぱり勉強しないとダメっぽいです。

そして問題の主キーについて。
複合主キーへの対応は何とかできそうです。ただし、Rubyのバージョンを 1.9.2 から 1.9.3(安定版) に変更する必要があります。
数値以外の主キーについては、私の技量不足です。もっと検証しないと断言できないので、曖昧な表現に留めさせていただきました。

さて、これで後輩達の問題は解決するのか。
そして、このツール開発は成功するのか。
結果は年末(2013/12)に明らかになる!きっと。

  1. 本来は後輩が担当すべき“課題”なのですが、ちょっとヘルプに入ることにしました。 [back]
  2. 普段はCentOS 5 の仮想マシンを使ってます。いや、そろそろ 6.4 にすべきなんでしょうけどね。 [back]
  3. Rubygemsは、「Ruby言語用のパッケージ管理システム」らしいので、細かいバージョンは無視して大丈夫なのかも… [back]
  4. 今回は接続先が Oracle DB 11g なので、そのバージョンに合わせました。12c のを使っても繋がりそうですが、今回は無難に… [back]
  5. 今回の検証用DBはUTF8のため、AL32UTF8 を設定しました [back]
  6. 逆に不安になりますね… [back]
  7. 前提知識が無いと検証もできないんだけどね… [back]
  8. 私は中堅レベルかな [back]

, , , ,

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">