ActiveRecord-JDBC で sqlite3 のアクセス
以前、jruby で Activerecord-jdbc で sqlite3 アクセスしようとした際は、
sqlite3 アダプターが無かったので、実現できずにいた。
たまたま、今日 sqlite3 アダプタができていることを知った。
- http://weblogs.java.net/blog/arungupta/archive/2008/07/totd_37_sqlite3.html
> Arun Gupta's Blog: TOTD #37: SQLite3 with Ruby-on-Rails on GlassFish Gem
そこで、ruby + activerecord + sqlite3 のプログラムを探し、次のサイトをみつけて、これを jruby + acriverecord0jdbc + sqlite3 に書き換えてみた。
まずは ruby 版。
$ cat ruby-01.rb
# See http://d.hatena.ne.jp/urekat/20080923/1222169086
require "pp"
require "rubygems"
require "active_record"
commands = <<END
ruby -v
which sqlite3
sqlite3 --version
gem list | grep sqlite3-ruby
gem list | grep activerecord
END
commands.each do |cmd|
puts "'#{ cmd.strip}' => '#{`#{ cmd}`.strip}'"
end
ActiveRecord::Base.logger = Logger.new($stderr)
ActiveRecord::Base.establish_connection(
:adapter => "sqlite3",
:database => "_sqlite3_ar_test.sqlite3",
:timeout => 5000
)
begin
ActiveRecord::Migration.create_table :users do |t|
t.column :name , :string
t.column :nickname , :string
t.column :profile , :text
t.column :created_at , :datetime
t.column :updated_at , :datetime
end
rescue
end
class User < ActiveRecord::Base
end
User.create(
:name => "sasaki takeru",
:nickname => "urekat",
:profile => "hehe hoho."
)
puts "User.count=#{User.count}"
pp User.find(:all)
次が jruby 版。
$ cat jruby-01.rb
# See http://d.hatena.ne.jp/urekat/20080923/1222169086
require "pp"
require "rubygems"
require "active_record"
commands = <<END
jruby -v
which sqlite3
sqlite3 --version
jruby -S gem list | grep activerecord-jdbcsqlite3-adapter
jruby -S gem list | grep ActiveRecord-JDBC
END
commands.each do |cmd|
puts "'#{ cmd.strip}' => '#{`#{ cmd}`.strip}'"
end
ActiveRecord::Base.logger = Logger.new($stderr)
ActiveRecord::Base.establish_connection(
:adapter => "jdbcsqlite3",
:database => "_sqlite3_ar_test.sqlite3",
:timeout => 5000
)
begin
ActiveRecord::Migration.create_table :users do |t|
t.column :name , :string
t.column :nickname , :string
t.column :profile , :text
t.column :created_at , :datetime
t.column :updated_at , :datetime
end
rescue
end
class User < ActiveRecord::Base
end
User.create(
:name => "sasaki takeru",
:nickname => "urekat",
:profile => "hehe hoho."
)
puts "User.count=#{User.count}"
pp User.find(:all)
では、走らせてみよう。
$ ruby ruby-01.rb
ruby -v' => 'ruby 1.8.7 (2008-08-11 patchlevel 72) [i686-darwin9]'
'which sqlite3' => '/opt/local/bin/sqlite3'
'sqlite3 --version' => '3.6.4'
'gem list | grep sqlite3-ruby' => 'sqlite3-ruby (1.2.4)'
'gem list | grep activerecord' => 'activerecord (2.1.2, 2.1.0)
activerecord-jdbc-adapter (0.8.2)
activerecord-jdbcsqlite3-adapter (0.8.2)'
-- create_table(:users)
SQL (0.000417) select sqlite_version(*)
SQL (0.003166) CREATE TABLE "users" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar(255), "nickname" varchar(255), "profile" text, "created_at" datetime, "updated_at" datetime)
-> 0.0382s
User Create (0.000448) INSERT INTO "users" ("name", "created_at", "profile", "nickname", "updated_at") VALUES('sasaki takeru', '2008-11-08 13:30:46', 'hehe hoho.', 'urekat', '2008-11-08 13:30:46')
SQL (0.000230) SELECT count(*) AS count_all FROM "users"
User.count=1
User Load (0.000269) SELECT * FROM "users"
[#<User id: 1, name: "sasaki takeru", nickname: "urekat", profile: "hehe hoho.", created_at: "2008-11-08 13:30:46", updated_at: "2008-11-08 13:30:46">]
続けて、jruby 版。
$ jruby jruby-01.rb
jruby -v' => 'jruby 1.1.5 (ruby 1.8.6 patchlevel 114) (2008-11-08 rev 6586) [i386-java]'
'which sqlite3' => '/opt/local/bin/sqlite3'
'sqlite3 --version' => '3.6.4'
'jruby -S gem list | grep activerecord-jdbcsqlite3-adapter' => 'activerecord-jdbcsqlite3-adapter (0.8.2)'
'jruby -S gem list | grep ActiveRecord-JDBC' => 'ActiveRecord-JDBC (0.5)'
-- create_table(:users)
SQL (0.000000) ActiveRecord::ActiveRecordError: table users already exists: CREATE TABLE users (id INTEGER PRIMARY KEY AUTOINCREMENT, name text(0), nickname text(0), profile text, created_at INTEGER, updated_at INTEGER)
User Create (0.005822) INSERT INTO users (name, nickname, profile, created_at, updated_at) VALUES('sasaki takeru', 'urekat', 'hehe hoho.', '2008-11-08 13:31:27', '2008-11-08 13:31:27')
SQL (0.003723) SELECT SEQ FROM SQLITE_SEQUENCE WHERE NAME = 'users'
SQL (0.003101) SELECT count(*) AS count_all FROM users
User.count=2
User Load (0.006008) SELECT * FROM users
[#<User id: 1, name: "sasaki takeru", nickname: "urekat", profile: "hehe hoho.", created_at: "2008-11-08 13:30:46", updated_at: "2008-11-08 13:30:46">,
#<User id: 2, name: "sasaki takeru", nickname: "urekat", profile: "hehe hoho.", created_at: "2008-11-08 13:31:27", updated_at: "2008-11-08 13:31:27">]
ちゃんと データ総数が増えている。
| 固定リンク
« ピックアップ: IEへのWebKit採用に興味ある, JRuby 1.1.5 and Click 1.5, etc... | トップページ | jruby と ruby での DB アクセスの速度 »



![Martin Odersky: Scalaスケーラブルプログラミング[コンセプト&コーディング] (Programming in Scala)](http://ecx.images-amazon.com/images/I/41nFY0KbnfL._SL75_.jpg)










![: プライド デラックス版 [DVD]](http://ecx.images-amazon.com/images/I/519KxrFf4IL._SL75_.jpg)

![: 善き人のためのソナタ スタンダード・エディション [DVD]](http://ecx.images-amazon.com/images/I/51fvaI3hDDL._SL75_.jpg)



![: ニュー・シネマ・パラダイス 完全オリジナル版 [DVD]](http://ecx.images-amazon.com/images/I/51Nu20bEvoL._SL75_.jpg)
![: ダークナイト [DVD]](http://ecx.images-amazon.com/images/I/51zwANY%2BEvL._SL75_.jpg)






![古堅 真彦: Flash Math & Physics Design:ActionScript 3.0による数学・物理学表現[入門編]](http://ecx.images-amazon.com/images/I/51vM6bM1sbL._SL75_.jpg)






















コメント
はじめまして.
私自身もJRuby上にてSQLite3を利用しようとして苦戦していたところ,こちらのブログにたどり着きました.
現在以下のような環境でJRubyを利用してます.
OS:WindowsXP Pro SP3
JRuby:1.1.5
gemにて以下をインストール.
--------------------------------------
ActiveRecord-JDBC-0.5
activerecord-jdbc-adapter-0.8.2
jdbc-sqlite3-3.5.8
activerecord-jdbcsqlite3-adapter-0.8.2
activerecord-jdbc-adapter-0.8.2
activesupport-2.1.2
activerecord-2.1.2
actionpack-2.1.2
actionmailer-2.1.2
activeresource-2.1.2
--------------------------------------
これで必要環境はそろっていると思われるのですが,ソースコード中の
「ActiveRecord::Base.establish_connection」
で以下のようなエラーが出ます.
C:/jruby/lib/ruby/gems/1.8/gems/activesupport-2.1.2/lib/active_support/dependencies.rb:513:in `require': undefined method `sqlite3_connection' for class `#' (NameError)
from C:/jruby/lib/ruby/gems/1.8/gems/activerecord-2.1.2/lib/active_record/connection_adapters/abstract/connection_specification.rb:227:in `establish_con
nection'
from ruby_sqlite_test.rb:28
gemで入れたSQLite3のアダプターなどがうまくリンクしていないという感じでしょうか・・・.
その他いろいろ調べながら以下もrequireしています.
gem 'ActiveRecord-JDBC'
require 'jdbc_adapter'
これを入れる前には「require "active_record"」のところで停止してしまっていました.
Rails環境ではなく,アプリケーションの一部としてSQLite3を利用と思っています.
なんとかお力をお借りしたいです.
投稿: いしはら | 2008-11-14 19:24
私の 環境を記します。
参考になれば、幸いです。
$ jruby -v
jruby 1.1.5 (ruby 1.8.6 patchlevel 114) (2008-11-08 rev 6586) [i386-java]
$ jruby -S gem list
*** LOCAL GEMS ***
activerecord (2.1.2)
ActiveRecord-JDBC (0.5)
activerecord-jdbc-adapter (0.8.2)
activerecord-jdbcsqlite3-adapter (0.8.2)
activesupport (2.1.2)
jdbc-sqlite3 (3.5.8)
jruby-openssl (0.3)
rake (0.8.3)
rspec (1.1.11)
sources (0.0.1)
$ port list installed | grep sqlite
rb-sqlite3 @1.2.1 ruby/rb-sqlite3
sqlite3 @3.6.4 databases/sqlite3
投稿: katoy | 2008-11-14 21:26
>katoyさん
返信ありがとうございます.
その後いろいろ弄った後,自分で追記した
gem 'ActiveRecord-JDBC'
require 'jdbc_adapter'
という部分を削除した後に実行しましたらうまくいきました.
Gemでインストールをしている途中に上記を追記したりしていたのでそこでこけていたようです.
katoyさん,どうもありがとうございました.
投稿: いしはら | 2008-11-17 17:41