2011年12月24日土曜日

[Rails3] Oracle DB と SQlite3 を併用した場合にエラー?

実行環境:
ruby 1.9.3
Rails 3.1.3
sqlite3 1.3.5
ruby-oci8 2.0.6
activerecord-oracle_enhanced-adapter 1.3.2, 1.4.0
1つのRailsアプリの中で SQlite3 DB と共にレガシーな Oracle DB を使おうとしてちょっとはまったのでメモ。

SQlite3 DBでアクセス(create)しようとすると、以下のようなエラーを頂戴いたしました。
undefined method `virtual?' for #<ActiveRecord::ConnectionAdapters::SQLiteColumn:0x1a477b8>

github に Connection to multiple database なんて書き込みがあり、先人がいた模様。
activerecord-oracle_enhanced-adapter 1.3.2では大丈夫だったのに 1.4.0 にあげたらエラーになった、ということなので、 1.3.2 に落としてみると SQlite3 DB への create も無事にOKになりました。


が、ここで新たな問題が発生。

set_primary_key を設定している Oracle DB のモデルに対して .find(params[:id]) とやると、
OCIError: ORA-01036: 変数の名前/数が無効です。: SELECT * FROM (SELECT "USER".* FROM "USER" WHERE "USER"."UID" = ? AND ....
と、引数で与えている id が SQL 文の中で展開されずに「?」のまま残っている模様…

しょうがないので、find ではなく where を使って Rails3 っぽく書き換えてみることに。
Rails2 的な書き方
@user = User.find(params[:id])
これを以下のように書き換える
Rails3 的な書き方
@usr = User.where("uid = ?", params[:id]).first
とりあえず動きました。

set_primary_key の意味があんまりないのでどうかな…
あと、今回は参照オンリーで検証してないので、更新作業とか問題ないのか不明です (^^;;;

※ちなみに 1.4.0 では上側の Rails2 的な書き方で通るので、そっちが正しい動きのような気がします。

0 件のコメント:

コメントを投稿