【问题标题】:JRuby and SQLite3JRuby 和 SQLite3
【发布时间】:2013-03-09 14:33:43
【问题描述】:

我正在尝试使用以下 gems 使 JRuby 和 SQLite3 工作:

充气城堡 java (1.5.0146.1)

捆绑器 (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)

机架 (1.5.2)

机架保护 (1.4.0)

耙子 (10.0.3)

rubygems-bundler (1.1.1)

rvm (1.11.3.6)

西纳特拉 (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: Unable to load driver 'jdbc' (基础错误: wrong constant name jdbc) /home/gl/.rvm/gems/jruby-1.7.3/gems/dbi-0.4.5/lib/dbi.rb:300 的加载驱动程序 mon_synchronize 在 /home/gl/.rvm/rubies/jruby-1.7.3/lib/ruby/1.9/monitor.rb:211 /home/gl/.rvm/gems/jruby-1.7.3/gems/dbi-0.4.5/lib/dbi.rb:242 的加载驱动程序 _get_full_driver 在 /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 连接 (根)在 srv.rb:6

你有想法吗?

【问题讨论】:

    标签: jdbc sqlite jruby sqlite3-ruby


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      您可以这样执行裸 SQL:

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

      【讨论】:

      • 我想输入原始的 sql 查询。
      • 这并没有回答这个问题 - 有很多原因可以说明为什么有人可能会选择 DBI 而不是 ActiveRecord,并且在很多情况下,直接访问数据库而不是重量级的 ORM 抽象将是一个谨慎的选择.
      • 问题是“你有想法吗?”所以我提出了一个在类似情况下对我有用的想法。其他限制没有明确说明。
      【解决方案3】:

      接受的答案不起作用(至少对我来说)。我在 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
      

      【讨论】:

        猜你喜欢
        • 2019-03-10
        • 2011-12-06
        • 1970-01-01
        • 2011-12-10
        • 1970-01-01
        • 2010-12-15
        • 2013-09-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多