sybase от ruby: соединение JDBC с Sybase - PullRequest
3 голосов
/ 22 февраля 2012

Мне нужно подключиться к довольно старой базе данных Sybase из Ruby.

Я закончил тем, что использовал jRuby, только потому, что не мог заставить работать любой способ подключения к Sybase из MRI;Если есть способ, который действительно работает, и он не сумасшедший, установить соединение Sybase для старой версии Sybase, это было бы здорово.Но я бью головой о стену на некоторое время, я думаю, что нет.

Так что я завелся в jRuby, чтобы использовать JDBC.У меня есть файл JDBC.jar, который работает для подключения к Sybase.

Я знаю, что я могу написать необработанный код JDBC в jRuby, как в Java, используя API JDBC.Но JDBC API - это такой медведь, с которым приходится работать, помимо прочего, он очень плох в экранировании / защите от инъекций (или, может быть, я просто не понимаю, как правильно его использовать, см. «Трудно работать», по крайней мере, длямне).

Существуют ли библиотеки Ruby 'wrapper', которые будут работать в jRuby в качестве оболочки для произвольного JDBC?Если бы я мог заставить его работать с ActiveRecord, это было бы круто, но на самом деле не обязательно.

Я использовал пакет Ruby 'DBI', который действительно работал отлично.Но пакет Ruby DBI, кажется, не поддерживается, и мне становится все труднее его использовать;есть несколько запросов на получение (https://github.com/erikh/ruby-dbi/issues), связанных с тем, чтобы заставить его работать в соответствии с 1.9.3, отключением предупреждений об устаревании и т. д., на которые не обращают внимание коммиттеры. Я отправил электронное письмо владельцу проекта github, чтобы спросить, есть ли шансих приняли, и они получили ответ «Нет», состоящий из одного слова, без объяснения причин. Не совсем уверен, что происходит.

Итак, каковы мои варианты подключения к Sybase из Ruby с помощью jRuby JDBC илиДругой?

(В соответствии с требованиями ниже, я добавлю, что я использую RHEL 5 в качестве ОС. Но если ответ «когда вы установите FreeTDS, вы можете сделать X, Y и Z как этот»Мне, вероятно, удастся установить FreeTDS самостоятельно. В прошлом я был в тупике даже ПОСЛЕ установки FreeTDS на хост).

Ответы [ 4 ]

2 голосов
/ 23 февраля 2012

Я использовал JTDS jar и activerecord-jdbc-adapter gem для моего проекта Rails 3 / Sybase ASE 15.

Единственная проблема, с которой я столкнулся - это ограничение и смещение для Sybase, которые на самом деле не поддерживаются.Я пишу своим посетителям, чтобы они работали с лимитами и смещениями.

Вы можете посмотреть здесь: https://github.com/arkadiyk/ar-sybase-jdbc-adapter

1 голос
/ 12 июня 2012

Этот вопрос, похоже, заброшен, но я бы хотел добиться успеха.Я хотел бы начать с заявления о том, что это работает в Windows и Linux.

В настоящее время я использую MSSQL v7 и MSSQL v8 из jruby с дистрибутивами драйвера JDBC, которые я скачал с microsoft.

Проблема в том, что драйверы JDBC 3.0 и 4.0 не могут подключиться к MSSQL v7.Мне очень повезло узнать, что JDBC 2.0 действительно работает против этого.

Я не уверен, что озабоченность ОП была связана с внедрением SQL, но эти драйверы способны создавать подготовленные операторы (для многораздельного SQL) и вызываемые операторы (для SP), которые можно использовать для безопасного экранирования параметров .

Насчет безобразия, да, ты прав.Вот почему требуется немного кода:

class Java::ComMicrosoftSqlserverJdbc::SQLServerResultSet
  def to_a
    #I used meta_data here to convert resultset to array of hashes 
  end
end    

и для получения нескольких результатов из одного оператора выбора:

yap= connection.create_statement
rowing= yap.execute sql
row_the_boat= []
while rowing
  row_the_boat<< yap.get_result_set.to_a
  rowing= yap.get_more_results
end
0 голосов
/ 21 февраля 2018

Я собрал простой пример использования FreeTDS / TinyTDS / Sequel с SyBase (у нас есть Sybase ASE 15.3)

См. Пример horizon-tds-GitHub / repo для Dockerfile

#<!-- language: rb -->
require 'dotenv/load'
require 'sequel'
require 'tiny_tds'
require 'awesome_print'

opts = {
  adapter: 'tinytds',
  login_timeout: 5,
  timeout: 10,
  tds_version: '50',   #42 or 50
  host:     ENV['APP_HZ_HOST'],
  port:     ENV['APP_HZ_PORT'],
  database: ENV['APP_HZ_DATABASE'],
  username: ENV['APP_HZ_USER'],
  password: ENV['APP_HZ_PASSWORD']
}
bib_id = Integer( ARGV[0] || 0 )
tag_num =  ARGV[1] || ''

sql = "SELECT  * FROM [bib] WHERE bib#=? AND tag=?"
DB = Sequel.connect opts
dataset = DB[sql, bib_id, tag_num]
dataset.each do |row|
  ap row
end
0 голосов
/ 22 февраля 2012

Я использовал FreeTDS и TinyTDS в Linux через Сиквел , чтобы получить доступ к некоторым из наших MSSQL и Sybase DBM.

Это было не так элегантно, как использование MySQL или Postgres, но выполнимо. И Sequel - очень хороший инструмент для доступа к БД без Rails. Это очень мощный и гибкий.

...