Каков наилучший способ подключения к SQL Server из Ruby на OS X? - PullRequest
3 голосов
/ 20 октября 2010

Мне нужно позволить моему приложению Rails подключиться к базе данных MS SQL Server и выполнить простой запрос для поиска. Основная БД для приложения - MySQL. Это просто нужно сделать эту вещь SQL Server на стороне.

Какой лучший способ сделать это?

Я мог бы написать совершенно отдельное приложение на Java, которое подключается к БД и выгружает некоторые XML-данные в файловую систему, чтобы мое приложение Ruby могло их забрать.

Или я мог бы возиться с подключением Ruby ODBC. Я сделал поиск на Gemcutter и нашел эти ...

  • dbd-odbc (0.2.5) 11141 скачиваний
  • ruby-odbc (0.99992) 6390 загрузок
  • activerecord-odbc-adapter (2.0) 2333 загрузки
  • odbc-rails (1.5) 2167 загрузок

Это будет означать подключение к двум разным БД из одного приложения Rails. Я даже не уверен, как это сделать.

У кого-нибудь есть опыт работы с SQL Server в Ruby? Есть мысли о том, какой подход наиболее практичен?


ОБНОВЛЕНИЕ - все заработало

Спасибо за помощь. Основываясь на ответах и ​​некоторых исследованиях, я решил это. Я собираюсь вставить свои заметки ниже. Извините за случайный тон. Я просто скопировал их.

Действия, предпринятые для подключения к SQL Server с Ruby в OS X

Скачать, настроить, собрать библиотеку FreeTDS

Документы довольно подробные и четко написаны, в основном. В критических местах есть несколько проблем, которые стоят мне несколько часов на устранение неисправностей.

По умолчанию он устанавливается в /usr/local/freetds/lib.

Это дает вам кучу утилит и прочего. Они могут помочь с тестированием и устранением неисправностей.

Например, из документов: «Утилита tsql предоставляется как часть FreeTDS специально для устранения неполадок».

Добавил это в / etc / profile:

# 2010-10-19
# To support the FreeTDS library for connecting Ruby to SQL Server.

PATH=$PATH:/usr/local/freetds/bin

# Have FreeTDS to log some output.
#export TDSDUMP=/tmp/freetds.log
#export TDSDUMPCONFIG=/tmp/freetdb_config.log

export PATH

Файл конфигурации FreeTDS

Необходимо создать файл конфигурации для FreeTDS. Документы перечисляют несколько мест, где это может быть сохранено. Единственный, кто работал на меня, был ~/.freetds.conf ...

[DATA_SERVER_NAME]
    host = hostname
    port = 1433
    tds version = 8.0

Вот и весь конфиг. Для [DATA_SERVER_NAME] вы не можете использовать имя хоста, иначе оно не будет работать. Используйте интуитивно понятное логическое имя. Вы будете использовать это имя, когда подключитесь к нему внутри кода Ruby с помощью гема tiny_tds.

Не нужно настраивать ODBC

Несмотря на то, что сказано в документации FreeTDS, нет необходимости создавать файл odbc.ini или odbcinst.ini. Работает без него.

Установлен крошечный драгоценный камень

Gem tiny_tds соединяет Ruby с FreeTDS с базой данных SQL Server. В tiny_tds документах написано ...

'... пожалуйста, не забудьте скомпилировать FreeTDS с поддержкой libiconv, чтобы кодировки работали наилучшим образом. Запустите «tsql -C» в консоли и проверьте «iconv library: yes». '

Я смог это сделать, и это сработало.

Он должен работать так:

require 'tiny_tds'
client = TinyTds::Client.new(:username => '...username...', :password => '...password...', :dataserver => 'DATA_SERVER_NAME')
sql = '... whatever ...'
result = client.execute(sql)
client.close

ActiveRecord

Предположительно, вы можете использовать ActiveRecord с SQL Server после того, как вы все настроите, установив гем activerecord-sqlserver-adapter. Мне это не нужно, поэтому я не установил его.

Ответы [ 4 ]

5 голосов
/ 20 октября 2010

В настоящее время ведется большая разработка необходимых гемов для подключения к MS SQL.

Краткое резюме:

  • вам больше не нужны dbi или dbd. (Руководство, опубликованное c0r0ner для старых)
  • все, что вам нужно, это freetds, ruby-odbc и activerecord-sqlserver-adapter
    (следуйте инструкциям Ксавье Шея, опубликованным wuputah)
  • обратите внимание на то, что tiny_tds скоро появится в качестве замены ruby-odbc
    Это делает настройку еще проще и ускоряет доступ к базе данных
    (http://github.com/rails-sqlserver/tiny_tds)
1 голос
/ 20 октября 2010

Вы можете использовать такую ​​же стратегию, как я объяснил в этом ответе , но используйте адаптер ODBC, как описано здесь в вашем файле database.yml. Так что в основном вы бы сделали:

class SQLServerThing < ActiveRecord::Base
  establish_connection :sqlserver
  set_table_name 'things'
end

Теперь вы можете сделать:

SQLServerThing.find(1)

Или выполнить общие запросы к базе данных, выполните:

SQLServerThing.connection.select_all("SELECT * FROM table ...")

Если у вас нет желания использовать обычные методы ActiveRecord, указывать имя таблицы необязательно.

Дополнительный гем (magic_multi_connections) не требуется, если вы не хотите подключаться к нескольким базам данных из одной модели. Используя отдельную модель, вы можете избежать использования отдельной библиотеки.

0 голосов
/ 20 октября 2010

Здесь - хороший урок, как это сделать.

В общем вам понадобится:

Системный уровень

  • FreeTDS
  • tdsodbc
  • libdbd-рубиновый-ODBC

Драгоценные камни

  • DBI
  • DBD-ODBC
  • ActiveRecord-SQLServer-адаптер
  • ActiveRecord-переходник ODBC

Последние два - если вы планируете использовать activerecord.

0 голосов
/ 20 октября 2010

Я только что прочитал в книге, что есть драгоценный камень под названием "Волшебное мультисоединение"

Есть репозиторий Git: http://github.com/drnic/magic_multi_connections

Вы можете Google это, но я никогда не пробовалэто сам, поэтому я предлагаю вам спросить больше об этом или создать простое приложение, которое взаимодействует с вашими двумя СУБД и посмотреть, работает ли оно.

...