[Rails] Ruby on RailsでOracleを利用
cheero Power Plus DANBOARD Versionを他バージョンと比較 あけおめ。ことよろ。 -2014-
とある理由から、後述の環境で「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 を使うのは初めてですが、何とかなりました。2
2.2 Ruby環境の準備
想定環境にある環境にまでセットアップしていきます。
下記のWebページを参考にして ruby, gem, rails のセットアップをしてみます。
CentOS 6.2 に RVM、Ruby、Ruby on Rails をインストール – あるSEのつぶやき
実行したコマンドをつらつらと書いておきます。
1 2 3 |
# rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm # yum -y install git make gcc gcc-c++ zlib-devel openssl-devel httpd-devel curl curl-devel readline-devel tk-devel libyaml-devel # bash -s stable <<(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer) |
RVMを使ってrubyをインストール
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# rvm list known # MRI Rubies [ruby-]1.8.6[-p420] [ruby-]1.8.7[-p374] [ruby-]1.9.1[-p431] [ruby-]1.9.2[-p320] [ruby-]1.9.3[-p448] [ruby-]2.0.0-p195 [ruby-]2.0.0[-p247] [ruby-]2.0.0-head ruby-head # GoRuby goruby # Topaz topaz (以下省略) |
ターゲット(ruby 1.9.2)を捕捉。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
# rvm install 1.9.2 Searching for binary rubies, this might take some time. No binary rubies available for: centos/6/i386/ruby-1.9.2-p320. Continuing with compilation. Please read 'rvm help mount' to get more information on binary rubies. Checking requirements for centos. Installing requirements for centos. Installing required packages: libffi-devel, libtool, bison................................................. Requirements installation successful. Installing Ruby from source to: /usr/local/rvm/rubies/ruby-1.9.2-p320, this may take a while depending on your cpu(s)... ruby-1.9.2-p320 - #downloading ruby-1.9.2-p320, this may take a while depending on your connection... % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 8770k 100 8770k 0 0 1156k 0 0:00:07 0:00:07 --:--:-- 1299k ruby-1.9.2-p320 - #extracting ruby-1.9.2-p320 to /usr/local/rvm/src/ruby-1.9.2-p320 ruby-1.9.2-p320 - #extracted to /usr/local/rvm/src/ruby-1.9.2-p320 ruby-1.9.2-p320 - #configuring................................................................................................................................................................................................................................................................................................................................................................................................................................ ruby-1.9.2-p320 - #post-configuration ruby-1.9.2-p320 - #compiling...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... ruby-1.9.2-p320 - #installing.................... Retrieving rubygems-2.0.7 % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 329k 100 329k 0 0 1688k 0 --:--:-- --:--:-- --:--:-- 2151k Extracting rubygems-2.0.7 ... Removing old Rubygems files... Installing rubygems-2.0.7 for ruby-1.9.2-p320....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... Installation of rubygems completed successfully. Saving wrappers to '/usr/local/rvm/wrappers/ruby-1.9.2-p320'........ ruby-1.9.2-p320 - #adjusting #shebangs for (gem irb erb ri rdoc testrb rake). ruby-1.9.2-p320 - #importing default gemsets, this may take time....................... Install of ruby-1.9.2-p320 - #complete |
ruby 1.9.2 のインストールと同時に gem がインストールされたようです。
1 2 3 4 |
# ruby -v ruby 1.9.2p320 (2012-04-20 revision 35421) [i686-linux] # gem -v 2.0.7 |
何やら gem 2.0.3 ではなく gem 2.0.7 がインストールされた模様。
想定環境と違うので、gem 2.0.3 をインストールしておきます。3
1 2 3 4 5 6 7 8 |
# wget http://production.cf.rubygems.org/rubygems/rubygems-2.0.3.tgz # tar xvzf rubygems-2.0.3.tgz # cd rubygems-2.0.3 # gem -v 2.0.7 # ruby setup.rb # gem -v 2.0.3 |
次は Ruby on Rails のインストール。
1 2 3 4 5 |
# gem install rails -v 3.2.13 (中略) 29 gems installed # rails -v Rails 3.2.13 |
これでようやく想定環境が構築できました。
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をインストールして、環境変数を設定します。
1 2 3 4 |
# rpm -i ./oracle-instantclient11.2-basic-11.2.0.3.0-1.i386.rpm # rpm -i ./oracle-instantclient11.2-devel-11.2.0.3.0-1.i386.rpm # export LD_LIBRARY_PATH=/usr/lib/oracle/11.2/client/lib # export NLS_LANG=Japanese_Japan.AL32UTF8 |
4行目の文字コード指定は、接続先のOracleデータベースの文字コードにあわせて設定する必要があります。5
下記のSQLを実行することで「NLS_CHARACTERSET」の設定値が確認できます。
1 2 3 |
SELECT parameter, value FROM nls_database_parameters WHERE parameter = 'NLS_CHARACTERSET'; |
3.2 ruby-oci8をインストール
rubyforgeから ruby-oci8-2.1.5.tar.gz をダウンロードしてインストールします。
1 2 3 4 5 |
# wget http://rubyforge.org/frs/download.php/76831/ruby-oci8-2.1.5.tar.gz # tar xvzf ruby-oci8-2.1.5.tar.gz # cd ruby-oci8-2.1.5 # make # make install |
3.3 RubyからOracleへクエリ発行
準備が整ったので、RubyからOracleデータベースに接続するテストをしてみます。
1 |
ruby -r oci8 -e "OCI8.new('scott','tiger','//192.168.xx.xx:1522/ORA11').exec('SELECT * FROM test_001') do |r| puts r.join(','); end" |
上記のコマンドを実行すると、TEST_001テーブルのデータ全件が CSV形式(カンマ区切り)で出力されます。
上記のコマンドと同じようにSQL*Plusを使ってクエリを発行すると下記のようになります。
1 2 |
$ sqlplus scott/tiger@192.168.xx.xx:1522/ORA11 SQL> SELECT * FROM test_001; |
これで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」というアダプターが必要らしいです。
何も疑いもせずに、素直にインストールしてみます。
1 2 3 4 5 |
# gem install activerecord-oracle_enhanced-adapter Fetching: activerecord-oracle_enhanced-adapter-1.4.2.gem (100%) Successfully installed activerecord-oracle_enhanced-adapter-1.4.2 Installing ri documentation for activerecord-oracle_enhanced-adapter-1.4.2 1 gem installed |
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アプリケーションを作成
1 |
# rails new testapp --database=oracle |
データベース接続情報(config/database.yml)を修正
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
development: adapter: oracle database: testapp_development username: testapp password: ↓↓↓ development: database: ORA11 adapter: oracle_enhanced host: 192.168.xx.xx port: 1522 username: scott password: tiger encoding: utf8 pool: 10 |
モデルを生成…しようとしたらエラーになりました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
# rails generate model comic /usr/local/rvm/gems/ruby-1.9.2-p320/gems/execjs-2.0.0/lib/execjs/runtimes.rb:51:in `autodetect': Could not find a JavaScript runtime. See https://github.com/sstephenson/execjs for a list of available runtimes. (ExecJS::RuntimeUnavailable) from /usr/local/rvm/gems/ruby-1.9.2-p320/gems/execjs-2.0.0/lib/execjs.rb:5:in `<module:ExecJS>' from /usr/local/rvm/gems/ruby-1.9.2-p320/gems/execjs-2.0.0/lib/execjs.rb:4:in `<top (required)>' from /usr/local/rvm/gems/ruby-1.9.2-p320/gems/coffee-script-2.2.0/lib/coffee_script.rb:1:in `require' from /usr/local/rvm/gems/ruby-1.9.2-p320/gems/coffee-script-2.2.0/lib/coffee_script.rb:1:in `<top (required)>' from /usr/local/rvm/gems/ruby-1.9.2-p320/gems/coffee-script-2.2.0/lib/coffee-script.rb:1:in `require' from /usr/local/rvm/gems/ruby-1.9.2-p320/gems/coffee-script-2.2.0/lib/coffee-script.rb:1:in `<top (required)>' from /usr/local/rvm/gems/ruby-1.9.2-p320/gems/coffee-rails-3.2.2/lib/coffee-rails.rb:1:in `require' from /usr/local/rvm/gems/ruby-1.9.2-p320/gems/coffee-rails-3.2.2/lib/coffee-rails.rb:1:in `<top (required)>' from /usr/local/rvm/gems/ruby-1.9.2-p320@global/gems/bundler-1.3.5/lib/bundler/runtime.rb:72:in `require' from /usr/local/rvm/gems/ruby-1.9.2-p320@global/gems/bundler-1.3.5/lib/bundler/runtime.rb:72:in `block (2 levels) in require' from /usr/local/rvm/gems/ruby-1.9.2-p320@global/gems/bundler-1.3.5/lib/bundler/runtime.rb:70:in `each' from /usr/local/rvm/gems/ruby-1.9.2-p320@global/gems/bundler-1.3.5/lib/bundler/runtime.rb:70:in `block in require' from /usr/local/rvm/gems/ruby-1.9.2-p320@global/gems/bundler-1.3.5/lib/bundler/runtime.rb:59:in `each' from /usr/local/rvm/gems/ruby-1.9.2-p320@global/gems/bundler-1.3.5/lib/bundler/runtime.rb:59:in `require' from /usr/local/rvm/gems/ruby-1.9.2-p320@global/gems/bundler-1.3.5/lib/bundler.rb:132:in `require' from /root/app/testapp/config/application.rb:7:in `<top (required)>' from /usr/local/rvm/gems/ruby-1.9.2-p320/gems/railties-3.2.13/lib/rails/commands.rb:24:in `require' from /usr/local/rvm/gems/ruby-1.9.2-p320/gems/railties-3.2.13/lib/rails/commands.rb:24:in `<top (required)>' from script/rails:6:in `require' from script/rails:6:in `<main>' |
少しGoogleで検索してみたところ、下記のWebページが見つかりました。
http://kiyotakagoto.hatenablog.com/entry/2013/05/28/235727
Gemfile内の下記のコメントアウトを外すとイイみたいです。
1 2 3 4 5 6 7 8 9 10 11 |
# Gems used only for assets and not required # in production environments by default. group :assets do gem 'sass-rails', '~> 3.2.3' gem 'coffee-rails', '~> 3.2.1' # See https://github.com/sstephenson/execjs#readme for more supported runtimes # gem 'therubyracer', :platforms => :ruby gem 'uglifier', '>= 1.0.3' end |
リトライしてみると…今度は違うエラーが出てきました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
# bundle install # rails generate model comic /usr/local/rvm/gems/ruby-1.9.2-p320/gems/activesupport-3.2.13/lib/active_support/dependencies.rb:251:in `require': Please install the oracle_enhanced adapter: `gem install activerecord-oracle_enhanced-adapter` (no such file to load -- active_record/connection_adapters/oracle_enhanced_adapter) (LoadError) from /usr/local/rvm/gems/ruby-1.9.2-p320/gems/activesupport-3.2.13/lib/active_support/dependencies.rb:251:in `block in require' from /usr/local/rvm/gems/ruby-1.9.2-p320/gems/activesupport-3.2.13/lib/active_support/dependencies.rb:236:in `load_dependency' from /usr/local/rvm/gems/ruby-1.9.2-p320/gems/activesupport-3.2.13/lib/active_support/dependencies.rb:251:in `require' from /usr/local/rvm/gems/ruby-1.9.2-p320/gems/activerecord-3.2.13/lib/active_record/connection_adapters/abstract/connection_specification.rb:50:in `resolve_hash_connection' from /usr/local/rvm/gems/ruby-1.9.2-p320/gems/activerecord-3.2.13/lib/active_record/connection_adapters/abstract/connection_specification.rb:41:in `resolve_string_connection' from /usr/local/rvm/gems/ruby-1.9.2-p320/gems/activerecord-3.2.13/lib/active_record/connection_adapters/abstract/connection_specification.rb:25:in `spec' from /usr/local/rvm/gems/ruby-1.9.2-p320/gems/activerecord-3.2.13/lib/active_record/connection_adapters/abstract/connection_specification.rb:130:in `establish_connection' from /usr/local/rvm/gems/ruby-1.9.2-p320/gems/activerecord-3.2.13/lib/active_record/railtie.rb:82:in `block (2 levels) in <class:Railtie>' from /usr/local/rvm/gems/ruby-1.9.2-p320/gems/activesupport-3.2.13/lib/active_support/lazy_load_hooks.rb:36:in `instance_eval' from /usr/local/rvm/gems/ruby-1.9.2-p320/gems/activesupport-3.2.13/lib/active_support/lazy_load_hooks.rb:36:in `execute_hook' from /usr/local/rvm/gems/ruby-1.9.2-p320/gems/activesupport-3.2.13/lib/active_support/lazy_load_hooks.rb:43:in `block in run_load_hooks' from /usr/local/rvm/gems/ruby-1.9.2-p320/gems/activesupport-3.2.13/lib/active_support/lazy_load_hooks.rb:42:in `each' from /usr/local/rvm/gems/ruby-1.9.2-p320/gems/activesupport-3.2.13/lib/active_support/lazy_load_hooks.rb:42:in `run_load_hooks' from /usr/local/rvm/gems/ruby-1.9.2-p320/gems/activerecord-3.2.13/lib/active_record/base.rb:720:in `<top (required)>' from /usr/local/rvm/gems/ruby-1.9.2-p320/gems/activerecord-3.2.13/lib/active_record/railtie.rb:88:in `block in <class:Railtie>' from /usr/local/rvm/gems/ruby-1.9.2-p320/gems/railties-3.2.13/lib/rails/initializable.rb:30:in `instance_exec' from /usr/local/rvm/gems/ruby-1.9.2-p320/gems/railties-3.2.13/lib/rails/initializable.rb:30:in `run' from /usr/local/rvm/gems/ruby-1.9.2-p320/gems/railties-3.2.13/lib/rails/initializable.rb:55:in `block in run_initializers' from /usr/local/rvm/gems/ruby-1.9.2-p320/gems/railties-3.2.13/lib/rails/initializable.rb:54:in `each' from /usr/local/rvm/gems/ruby-1.9.2-p320/gems/railties-3.2.13/lib/rails/initializable.rb:54:in `run_initializers' from /usr/local/rvm/gems/ruby-1.9.2-p320/gems/railties-3.2.13/lib/rails/application.rb:136:in `initialize!' from /usr/local/rvm/gems/ruby-1.9.2-p320/gems/railties-3.2.13/lib/rails/railtie/configurable.rb:30:in `method_missing' from /root/app/testapp/config/environment.rb:5:in `<top (required)>' from /usr/local/rvm/gems/ruby-1.9.2-p320/gems/railties-3.2.13/lib/rails/application.rb:103:in `require' from /usr/local/rvm/gems/ruby-1.9.2-p320/gems/railties-3.2.13/lib/rails/application.rb:103:in `require_environment!' from /usr/local/rvm/gems/ruby-1.9.2-p320/gems/railties-3.2.13/lib/rails/commands.rb:25:in `<top (required)>' from script/rails:6:in `require' from script/rails:6:in `<main>' |
oracle_enhanced adapter が無いって言いたいのは分かりました。
そして、私が見落としていた情報がありました。
https://github.com/rsim/oracle-enhanced
上記Webページに、書いてあることをやっていませんでした。
Gemfile内に下記の記述を追記してやる必要があるようです。
1 2 |
gem 'activerecord-oracle_enhanced-adapter', '~> 1.4.0' gem 'ruby-oci8', '~> 2.1.0' |
さて、3度目の正直なるか!
1 2 3 4 5 6 7 8 |
# bundle install # rails generate model comic invoke active_record create db/migrate/20130825142603_create_comics.rb create app/models/comic.rb invoke test_unit create test/unit/comic_test.rb create test/fixtures/comics.yml |
無事にモデル生成まで進めました。(ここに至るまでに時間がかかりすぎました…)
その後、Oracleデータベースにテーブルを生成など、エラーもなく順調に進みました。6
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
# rake db:migrate == CreateComics: migrating =================================================== -- create_table(:comics) -> 0.0447s == CreateComics: migrated (0.0448s) ========================================== # rails generate scaffold comic name:string description:string price:float --skip-migration --skip-timestamps invoke active_record identical app/models/comic.rb invoke test_unit identical test/unit/comic_test.rb identical test/fixtures/comics.yml invoke resource_route route resources :comics invoke scaffold_controller identical app/controllers/comics_controller.rb invoke erb exist app/views/comics identical app/views/comics/index.html.erb identical app/views/comics/edit.html.erb identical app/views/comics/show.html.erb identical app/views/comics/new.html.erb identical app/views/comics/_form.html.erb invoke test_unit identical test/functional/comics_controller_test.rb invoke helper identical app/helpers/comics_helper.rb invoke test_unit identical test/unit/helpers/comics_helper_test.rb invoke assets invoke coffee identical app/assets/javascripts/comics.js.coffee invoke scss identical app/assets/stylesheets/comics.css.scss invoke scss identical app/assets/stylesheets/scaffolds.css.scss # rails server ≪http://localhost:3000/comics にアクセスしてデータ入力ができることを確認≫ |
これで、OracleデータベースのテーブルをRailsから操作することができました。
ただ、今回試したのは、Railsのルールに則ったテーブル作成・操作でした。
次は、Railsのルールに反することの実装に挑戦します。
5. 外部DB(複合主キー,数値以外のキー)にアクセスする
後輩がRailsについて調べていて絶望していたのがこのテーマ。
Rails単独利用のWebアプリケーションであれば、Railsのルールに則り「主キーは、数値型の”id”のみ」で実装できるかもしれませんが、本件で対応すべきOracleDBのテーブルは
- 複合主キー構成
- 数値以外が主キーとなりうる
という設計になっているため、何か手を打つ必要がありそうです。
5.1 複合主キーへの対応
composite_primary_keys というものを使えば複合主キーにも対応できそうなので、早速インストールしてみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# gem install composite_primary_keys Fetching: i18n-0.6.5.gem (100%) Successfully installed i18n-0.6.5 Fetching: minitest-4.7.5.gem (100%) Successfully installed minitest-4.7.5 Fetching: atomic-1.1.13.gem (100%) Building native extensions. This could take a while... Successfully installed atomic-1.1.13 Fetching: thread_safe-0.1.2.gem (100%) Successfully installed thread_safe-0.1.2 Fetching: activesupport-4.0.0.gem (100%) ERROR: Error installing composite_primary_keys: activesupport requires Ruby version >= 1.9.3. |
Rubyのバージョンが 1.9.3 以降でないとダメみたいですね。
…というわけで、Rubyを1.9.2から1.9.3に変えてみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# rvm install 1.9.3 # rvm --default 1.9.3 # rvm list rvm rubies ruby-1.9.2-p320 [ i686 ] =* ruby-1.9.3-p448 [ i686 ] # => - current # =* - current && default # * - default # ruby -v ruby 1.9.3p448 (2013-06-27 revision 41675) [i686-linux] |
Rubyを1.9.3に変えて、リトライ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
# gem install composite_primary_keys Fetching: i18n-0.6.5.gem (100%) Successfully installed i18n-0.6.5 Fetching: multi_json-1.7.9.gem (100%) Successfully installed multi_json-1.7.9 Fetching: tzinfo-0.3.37.gem (100%) Successfully installed tzinfo-0.3.37 Fetching: minitest-4.7.5.gem (100%) Successfully installed minitest-4.7.5 Fetching: atomic-1.1.13.gem (100%) Building native extensions. This could take a while... Successfully installed atomic-1.1.13 Fetching: thread_safe-0.1.2.gem (100%) Successfully installed thread_safe-0.1.2 Fetching: activesupport-4.0.0.gem (100%) Successfully installed activesupport-4.0.0 Fetching: builder-3.1.4.gem (100%) Successfully installed builder-3.1.4 Fetching: activemodel-4.0.0.gem (100%) Successfully installed activemodel-4.0.0 Fetching: arel-4.0.0.gem (100%) Successfully installed arel-4.0.0 Fetching: activerecord-deprecated_finders-1.0.3.gem (100%) Successfully installed activerecord-deprecated_finders-1.0.3 Fetching: activerecord-4.0.0.gem (100%) Successfully installed activerecord-4.0.0 Fetching: composite_primary_keys-6.0.0.gem (100%) Successfully installed composite_primary_keys-6.0.0 Installing ri documentation for i18n-0.6.5 Installing ri documentation for multi_json-1.7.9 Installing ri documentation for tzinfo-0.3.37 Installing ri documentation for minitest-4.7.5 Installing ri documentation for atomic-1.1.13 Installing ri documentation for thread_safe-0.1.2 Installing ri documentation for activesupport-4.0.0 unable to convert "\xF1" from ASCII-8BIT to UTF-8 for test/performance.rb, skipping Installing ri documentation for builder-3.1.4 Installing ri documentation for activemodel-4.0.0 Installing ri documentation for arel-4.0.0 Installing ri documentation for activerecord-deprecated_finders-1.0.3 Installing ri documentation for activerecord-4.0.0 Installing ri documentation for composite_primary_keys-6.0.0 13 gems installed |
無事にインストール完了です。
そして、Gemfileに下記内容を追記。
1 2 3 |
gem 'activerecord-oracle_enhanced-adapter', '~> 1.4.0' gem 'ruby-oci8', '~> 2.1.0' gem 'composite_primary_keys', '~> 5.0.4' |
例えば、List というモデルが
key1: integer, key2: integer, key3: integer という主キー構成のLISTSテーブルを利用する場合、下記のようになるようです。
1 2 3 4 5 6 |
class List < ActiveRecord::Base attr_accessible :col1, :col2, :key1, :key2, :key3 self.primary_keys = :key1, :key2, :key3 self.table_name = 'LISTS' end |
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)に明らかになる!きっと。
- 本来は後輩が担当すべき“課題”なのですが、ちょっとヘルプに入ることにしました。 [back]
- 普段はCentOS 5 の仮想マシンを使ってます。いや、そろそろ 6.4 にすべきなんでしょうけどね。 [back]
- Rubygemsは、「Ruby言語用のパッケージ管理システム」らしいので、細かいバージョンは無視して大丈夫なのかも… [back]
- 今回は接続先が Oracle DB 11g なので、そのバージョンに合わせました。12c のを使っても繋がりそうですが、今回は無難に… [back]
- 今回の検証用DBはUTF8のため、AL32UTF8 を設定しました [back]
- 逆に不安になりますね… [back]
- 前提知識が無いと検証もできないんだけどね… [back]
- 私は中堅レベルかな [back]
cheero Power Plus DANBOARD Versionを他バージョンと比較 あけおめ。ことよろ。 -2014-