Ruby on RailsでOracle Databaseにアクセス

(2006.12.19作成; 2007.6.17新規公開。)

(2011.8.10 更新。)

(2016.11) Rails 4.2 / 5対応.

私は普段、Ruby on Rails (RoR) ではPostgreSQL かMySQL をデータベース (RDBMS) として使っていますが、Oracle内のデータにアクセスする必要があったので、その手順を簡単にまとめてみました。

Linux、あるいは Windows (Cygwin) でRails アプリケーションを動かしてみます。別の機械で動くOracle 9i Release 2 (9.2) サーバにアクセスできるようにします。パフォーマンスについては考えません。

# インストール

(1) Instant Client

まずはOracle Databaseにアクセスするためのネイティブライブラリをインストールします。Oracleのサイトはだだっ広くて探しにくいですが、Instant Clientを入れればいいでしょう。

LinuxでもWindowsでも同じです。

ダウンロードには Oracleプロファイルへの登録が必要。

パッケージは Basicと SDKの二つが必要。コンパイルに必要な oci.h ヘッダが SDKパッケージのほうに入っています。

Fedora Linux の場合は rpm ファイルが簡単。インストールすると次のようになる。

$ rpm -qa | grep -i oracle
oracle-instantclient12.1-basic-12.1.0.2.0-1.x86_64
oracle-instantclient12.1-devel-12.1.0.2.0-1.x86_64

(2) ruby-oci8

次はRubyバインディングです。

基本, gemで入れます。パッケージ名は ruby-oci8 です。似た名前のものがあるので注意。

ライセンスは, バージョン2.1.3 から, 2条項BSDライセンス。

Oracle 9i Database へ接続したいときは, ruby-oci8 バージョン2.1.8を使う。Ruby 1.8.x のときも, 同じく, ruby-oci8 v2.1.8まで。

Instant Client のライブラリの場所を指定して、インストールします。

# export LD_LIBRARY_PATH=/usr/lib/oracle/12.1/client64/lib
# gem install ruby-oci8

gemでうまく入らない (コンパイルエラーなど) 場合は, gemのディレクトリにあるソースコードを適宜修正し、自分でコンパイル・インストールする。

インストール方法, 使用方法 (API) などはこちら;

Windows用のバイナリ版も用意されていますが、今回はCygwinなので、自分でコンパイルします。

Ruby/OCIのREADMEに沿ってコンパイル、インストールすれば大丈夫です。

$ ruby setup.rb config -- --with-instant-client=/opt/instantclient_10_2
$ make
$ su
# make install

setup.rb configの直後の--は誤りではありません。書き間違いかと思って省略するとエラーになります。(なりました。)

(3) ActiveRecordアダプタ

ActiveRecordにはOracleアダプタが含まれないので、別途、インストールします。

Rails バージョンごとのインストールすべきバージョン, config/database.yml ファイルの書き方も次から;

GitHub - rsim/oracle-enhanced: Oracle enhaced adapter for ActiveRecord

gemコマンド一発です。oracle と enhanced の間だけアンダーバーです。

Rails 4.2 の場合はバージョン 1.6.x, Rails 5.0 だと v1.7.xを使います。例えば, Rails 4.2 のときは, 次のようにします。

# gem install --version=1.6.7 activerecord-oracle_enhanced-adapter

Gemfile のほうも, バージョンを固定すること。

# 設定

(2007.8.23 追記。)

接続の指定

TNSNAMES.ORA ファイルを作成し、所定の場所に置きます。このファイルでデータベースサーバのIPアドレス、ポートを指定します。また、接続オプションもこのファイルに書きます。

Linuxの場合で、環境変数を何も指定しない場合は、/etc/tnsnames.ora (ファイル名は小文字) とします。

あとは、railsアプリケーションのconfig/database.ymlで、次のように設定すればOK。database名として、TNSNAMES.ORAファイル内の接続名を指定します。

development:
  adapter: oracle_enhanced
  database: hogehoge      
  username: hogehoge
  password: hogehoge

TNSNAMES.ORA ファイルを使わないときは、databaseオプションに「ホスト名 or IPアドレス/データベース名」と書きます。例えば、

  database: 192.168.11.11/oracleexample

環境変数

(2007.8.23 追記。)

クライアントの文字コードは、環境変数 NLS_LANG で設定します。設定した文字コードと違うと文字化けが起こります。私は最初、WindowsだとクライアントはシフトJIS決め打ちかと思っていました。

例えば、クライアントの文字コードをUTF8にするには、次のようにします。あるいは、Railsアプリケーションのconfig/environment.rb ファイルで設定します。

$ export NLS_LANG=japanese_japan.al32utf8

# 外部リンク

Oracle and Ruby on Rails [oracle.com]
Ruby on Rails with Oracle FAQ
Exploring Ruby on Rails (RoR)? This FAQ provides basic information about connecting to Oracle, installation, and creating Oracle Database XE + RoR applications.
Ruby on Rails on Oracle: A Simple Tutorial [oracle.com]
Rails is an easy framework to work with, but like any technology it takes time to master.