JRuby和SQLite3

时间:2013-03-09 14:33:43

标签: jdbc sqlite jruby sqlite3-ruby

我正在尝试用以下宝石制作JRuby和SQLite3:

  

bouncy-castle-java(1.5.0146.1)

     

bundler(1.3.2)

     

dbd-jdbc(0.1.6 java)

     

dbi(0.4.5)

     

已弃用(2.0.1)

     

jdbc-sqlite3(3.7.2.1)

     

jruby-launcher(1.0.15 java)

     

jruby-openssl(0.8.2)

     

json(1.7.7 java)

     

rack(1.5.2)

     

机架保护(1.4.0)

     

rake(10.0.3)

     

ruby​​gems-bundler(1.1.1)

     

rvm(1.11.3.6)

     

sinatra(1.3.5)

     

sqlite3(1.3.7)

     

倾斜(1.3.5)

和这段代码:

require 'java'
require 'dbi'
require 'dbd/Jdbc'
require 'jdbc/sqlite3'

dbh = DBI.connect(
  "DBI:jdbc:sqlite:db.sqlite",  # connection string
   '',                                 # no username for sqlite3
   '',                                 # no password for sqlite3
   'driver' => 'org.sqlite.JDBC')      # need to set the driver

但我有这个错误:

  

DBI :: InterfaceError:无法加载驱动程序'jdbc'(基础错误:错误的常量名称jdbc)          load_driver at /home/gl/.rvm/gems/jruby-1.7.3/gems/dbi-0.4.5/lib/dbi.rb:300      mon_synchronize at /home/gl/.rvm/rubies/jruby-1.7.3/lib/ruby/1.9/monitor.rb:211          load_driver at /home/gl/.rvm/gems/jruby-1.7.3/gems/dbi-0.4.5/lib/dbi.rb:242     _get_full_driver at /home/gl/.rvm/gems/jruby-1.7.3/gems/dbi-0.4.5/lib/dbi.rb:160              在/home/gl/.rvm/gems/jruby-1.7.3/gems/dbi-0.4.5/lib/dbi.rb:145连接               (root)at srv.rb:6

你有个主意吗?

3 个答案:

答案 0 :(得分:1)

我一直试图自己解决这个问题,最终成功了 - 问题是驱动程序名称现在是'Jdbc',而不是'jdbc' - 大小写很重要,无论是在连接字符串中,还是要求声明。如果将连接字符串更改为“DBI:Jdbc:sqlite:db.sqlite”,它应该可以正常工作。

答案 1 :(得分:0)

我建议你使用ActiveRecord而不是DBI。

您可以执行裸SQL:

ActiveRecord::Base.connection.execute("SELECT * FROM some_table") 

答案 2 :(得分:0)

接受的答案不起作用(至少对我而言)。我搜索SO和网络几个小时(那里有很多好的和坏的信息),最后找到了一个有效的解决方案(对我来说至少)。通过添加“Jdbc :: SQLite3.load_driver”行来解决问题的很大一部分。

require 'java'
require 'jdbc/sqlite3'

module JavaSql
  include_package 'java.sql'
end

Jdbc::SQLite3.load_driver
Java::org.sqlite.JDBC

conn_str = 'jdbc:sqlite:../Data/AflBettingHistory.db3'
conn = JavaSql::DriverManager.getConnection(conn_str)
stm = conn.createStatement
rs = stm.executeQuery("select Name from Team")
while (rs.next) do
  puts rs.getString("Name")
end
rs.close
stm.close
conn.close