2013-03-09 3 views
0

Я пытаюсь сделать работу JRuby и SQLite3 со следующими драгоценными камнями:JRuby и SQLite3

bouncy-castle-java (1.5.0146.1)

bundler (1.3.2)

dbd-jdbc (0.1.6 java)

dbi (0.4.5)

deprecated (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)

rack-protection (1.4.0)

rake (10.0.3)

rubygems-bundler (1.1.1)

rvm (1.11.3.6)

sinatra (1.3.5)

sqlite3 (1.3.7)

tilt (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' (underlying error: wrong constant name 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 connect at /home/gl/.rvm/gems/jruby-1.7.3/gems/dbi-0.4.5/lib/dbi.rb:145 (root) at srv.rb:6

У вас есть идея?

ответ

1

Я просто пытался решить эту проблему самостоятельно, и в конечном итоге удалось - проблема в том, что имя драйвера теперь «JDBC», а не " jdbc '- важна капитализация как в строке соединения, так и в требовании. Если вы измените строку подключения на «DBI: Jdbc: sqlite: db.sqlite», она должна работать нормально.

0

Я предлагаю вам использовать ActiveRecord, а не DBI.

Вы можете выполнить голую SQL таким образом:

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

Я хочу поставить необработанные sql-запросы. – GlinesMome

+0

Это не отвечает на вопрос - есть много причин, по которым кто-то может выбрать DBI поверх ActiveRecord, и множество ситуаций, когда прямой доступ к базе данных, а не абстракция ORM в супертяжелом состоянии, является разумным выбором. – mistertim

+0

Вопрос был «у вас есть идея?» Поэтому я выдвинул идею, которая сработала для меня в подобных случаях. Другие ограничения не были сформулированы. – Rob

0

Принятый ответ не работает (по крайней мере, для меня). Я искал SO и Web в течение нескольких часов (там много хорошей и плохой информации) и, наконец, наткнулось на решение, которое работает (по крайней мере, для меня). Большая часть проблемы решена путем добавления строки '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