2007-09-02

Railsと Oracle

大抵 Rails入門の記事は MySQLが対象になっているので Oracle用の使い方をメモしておく。

まず Oracle Clientが必要
Oracle (Instant) Clientを入れて SQL*Plusが動くような状態になったら、ruby-oci8 を入れる。Gentooなら emerge ruby-oci8 で良い。

ここでは personオブジェクトを格納するテーブル people を作り、それに対するCRUD操作を提供するWeb画面を作る例を示す。
(ちなみにクラス名は単数形、テーブル名は複数形。普段英語を使い慣れていない向きには「どっちが複数だっけ?」と悩むこともしばしばだが、Rails(ActiveRecord)の「規約」はそういうことになっている。bookクラスのオブジェクトを格納するテーブルは booksね)

なお Railsアプリケーションの雛形は railsコマンドで既に出来ており、そのディレクトリの中にいるものとする。

SQL*Plusでデータベースに接続し、テーブルを作る。

create table people (
id number(10) primary key,
name varchar(255)
);
create sequence people_seq;

「idと名の付く列はオートナンバーの適用されるキー列であり、順序から値が移入される。順序名はテーブル名に_seqを付けたもの」というActiveRecord(+Oracle)の「規約」のようである。この割り切りがCoCというやつか。
Oracleデータベースにオートナンバーの処理を行わせるにはトリガーの作成が必須だが、ActiveRecordは自分で順序からID列へ値を移入するため、この場合はデータベース側にトリガーを作るべきでない。

app/models/person.rbというファイルを下記の内容で作成。personは単数形、personは単数形・・・ぼそぼそ

class Person < ActiveRecord::Base
end

とりあえず、中身の記述無し。普通に Javaの考え方だと、エンティティクラスを作るときにはこのテーブルに一体どんな列が含まれているのかまで書いてやらなければならないのだが、ActiveRecordsでは実行時に勝手にDBへ問い合わせて内容を決定できるので、これでも動作する。これもDOAというのだろうか。

conf/database.yml というファイルにデータベースの設定を書き込む。この設定ファイルには「開発用DB(development)」「テスト用DB(test)」「本番用DB(production)」の設定をそれぞれ書くことが出来る。
繰り返しになるが世の中にある Railsの情報はほとんど MySQL向けに書かれているため、Oracleの場合は少し違うことを書かなければならない。

development:
adapter: oci
username: scott
password: tiger
host: mydbhost/XE

adapterが ociになること。database指定がない(OracleとMySQLの違いをわかっている人なら理由は自明だろう)こと。hostは TNS名もしくはホスト名/サービス名の形式を取ること。

上記の設定が済んだら、generate scaffold を実行し、personオブジェクト用のCRUD操作画面を自動生成する。

$ ruby script/generate scaffold person




これで peopleというコントローラが作成され(こっちは複数形)、Webからデータの一覧や詳細を見たり、作成したり、編集したり、削除したりできるようになった。一覧表示のURIは (railsアプリケーションのルート)/people/list になる。

あと、OracleのNLS_LANGが UTF8になっているなら、config/environment.rbに $KCODE = 'u' の1行を追加しておいたほうがいいと思う。

ラベル: ,

0 件のコメント:

コメントを投稿

<< ホーム