Hatena::ブログ(Diary)

akimatter このページをアンテナに追加 RSSフィード

2007-09-11

Task not supported by 'jdbc'

| 16:33 |  Task not supported by 'jdbc'を含むブックマーク  Task not supported by 'jdbc'のブックマークコメント

jrubyテストを実行しようとしたらjdbcサポートされてないタスクだとか言われました。

rake aborted!

Task not supported by 'jdbc'

Turns out this is due to some hard coded values in the rails rake tasks. It has an easy fix by way of Ola Bini:


cd $JRUBY_HOME/lib/ruby/gems/1.8/gems/ActiveRecord-JDBC-0.3.1/lib

svn checkout svn://rubyforge.org/var/svn/jruby-extras/trunk/activerecord-jdbc/lib/tasks

This pulls down a file jdbc_databases.rake that I could only find in the subversion repository for now. Copy that file to the bookstore lib/tasks directory:


cp tasks/jdbc_databases.rake ~/jruby_stuff/bookstore/lib/tasks

Musings of a Software Development Manager 損 Blog Archive 損 Deploying Rails to Tomcat as a WAR with JRuby

ActiveRecord-JDBC用のタスクアプリケーションのlib/tasksにコピーしてあげればOK。タスク自身は $JRUBY_HOME/lib/ruby/gems/1.8/gems/ActiveRecord-JDBC-0.x/lib にあります。

リンク先ではActiveRecord-JDBC-0.3.1の頃の話ですが、ActiveRecord-JDBC-0.5の現在ではSVNでチェックアウトしなくてもリリースされたパッケージの中に含まれているので、チェックアウトとかする必要ないっす。

recreate_database

| 17:40 |  recreate_databaseを含むブックマーク  recreate_databaseのブックマークコメント

上の問題はクリアしたけど、次はAdapterの問題に当たりました。DBHSQLDBを使って test:units しようと思っているのですが、

undefined method `recreate_database' for #<ActiveRecord::ConnectionAdapters::JdbcAdapter:0x94b146>

ええー!?調べてみたらjdbc_hsqldb.rbには、メソッドが書いてない。マジすか。

recreate_databaseを呼んでいるのは、上の問題を解決した lib/tasks/jdbc_databases.rake#57。タスクとしては db:purge に当たるんだけど、元のdb:purge はというと ActiveRecord::Base.configurations["test"]["adapter"] 毎に何をするのかが違ってます。

まあでも、だいたいはDBごと消してもう一回作るっていうことをそれぞれの書き方でやっている。

とりあえず、jdbc_oracle.rbの真似して、こんなパッチを当ててみたら動いたっぽいっす。

module ::JdbcSpec
  module HSQLDB
    def recreate_database(name)
      tables.each{ |table| drop_table(table) }
    end
  end
end

| 17:59 | ■を含むブックマーク ■のブックマークコメント

db/schema.rb 中の :float のカラム(:limit => nil)が real(17) というSQLとして出力されてしまってテストを実行できません。

仕方ないので、ActiveRecord-JDBC-0.5/lib/active_record/connection_adapters/jdbc_adapter.rb を以下のように書き換えてその場を凌ぐことにしました・・・。他にいい方法はないっすかね。

Index: jdbc_adapter.rb
===================================================================
--- jdbc_adapter.rb	(revision 740)
+++ jdbc_adapter.rb	(working copy)
@@ -27,7 +27,7 @@
           column_type_sql
         else
           limit ||= native[:limit]
-          column_type_sql += "(#{limit})" if limit
+          column_type_sql += "(#{limit})" if limit and (type != :float)
           column_type_sql
         end
       end

INSERT INTOでSQLException

| 18:20 |  INSERT INTOでSQLExceptionを含むブックマーク  INSERT INTOでSQLExceptionのブックマークコメント

やっと、なんとか

jruby -S rake test:units

は動くようにはなったものの、実行結果を見ると、fixtureをロードするところで

ActiveRecord::StatementInvalid: NativeException: java.sql.SQLException: This function is not supported: INSERT INTO users (salt, crypted_password, id, email, login, created_at) VAL
UES ('7e3041ebc2fc05a40c60028e2c4901a81035d3cd', '00742970dc9e6319f8019fd54864d3ea740f04b1', 1, 'quentin@example.com', 'quentin', '2007-09-06 17:45:46')

みたいなエラーが出ている。念のため別のJDBC経由でINSET文を実行してみたけどちゃんと動いてるのに!

で、よくよくログを見てみると、db:schema:load の最後で

  SQL (0.000000)   CREATE TABLE schema_info (version integer)
  SQL (0.000000)   NativeException: java.sql.SQLException: This function is not supported: INSERT INTO schema_info (version) VALUES(0)
  SQL (0.000000)   UPDATE schema_info SET version = 5                                                                                

とか言ってるし!ActiveRecordJDBC経由でINSET文を実行すると、SQLExceptionが発生するってこと?でも、

jruby script/console test 

で、XXXX.createとかしてみたけど、ちゃんとINSERT されている。ログにもINSERT文がちゃんと出てるし!意味不明杉。むきー!


追記

テストケース内のtest_xxxxxメソッドやsetupメソッドで、XXXX.create するとちゃんとINSERTできます。

トラックバック - http://d.hatena.ne.jp/akm/20070911
最近読んだ本
  • 情熱プログラマー ソフトウェア開発者の幸せな生き方
  • 禁煙セラピー[セラピーシリーズ]
  • 入門git
  • 入門Git
  • もやしもん(8) (イブニングKC)
  • JRuby 徹底入門
  • 入門Subversion Windows/Linux対応
  • Ship It! ソフトウェアプロジェクト 成功のための達人式ガイドブック
  • プログラミングRuby 第2版 言語編
  • プログラミングRuby 第2版 ライブラリ編