Подключение к SQL Server с ActiveRecord - PullRequest
13 голосов
/ 06 апреля 2009

Вам когда-нибудь приходилось подключаться к SQL Server через ActiveRecord? Это возможно? Кто-нибудь может предоставить некоторые отправные точки?

Ответы [ 3 ]

11 голосов
/ 06 апреля 2009

Это то, что я использовал:

Отсюда: http://github.com/rails-sqlserver/2000-2005-adapter/tree/master

Установка

Для начала вам понадобятся Ruby DBI и Ruby ODBC. Насколько мне известно, ADO DBD для DBI больше не поддерживается. Приведенная ниже установка не является исчерпывающим описанием того, как установить и / или настроить все необходимые движущиеся части, такие как FreeTDS. Он также предполагает установку gem как зависимых библиотек, так и самого адаптера.

Следует отметить, что эта версия адаптера была разработана с использованием как древней версии DBI 0.0.23 до текущей стабильной версии 0.4.0. Поскольку в более поздних версиях DBI многое изменится, НАСТОЯТЕЛЬНО РЕКОМЕНДУЕТСЯ довести до максимума установку до версии 0.4.0, которую показывают приведенные ниже примеры. В настоящее время мы не поддерживаем версии DBI выше 0.4.0. Хорошей новостью является то, что если вы использовали очень старый DBI с ADO, технически этот адаптер все еще будет работать для вас, но имейте в виду, что ваш путь устареет и может не поддерживаться долго.

$ gem install dbi --version 0.4.0
$ gem install dbd-odbc --version 0.2.4
$ gem install rails-sqlserver-2000-2005-adapter -s http://gems.github.com

Отсюда: http://lambie.org/2008/02/28/connecting-to-an-mssql-database-from-ruby-on-ubuntu/

Во-первых, обновите ваш ~ / .profile, включив в него следующее:

export ODBCINI=/etc/odbc.ini
export ODBCSYSINI=/etc
export FREETDSCONF=/etc/freetds/freetds.conf

Затем перезагрузите ваш .profile, выйдя из системы и войдя снова.

Во-вторых, на сервере Ubuntu 7.10 мне нужно было установить несколько пакетов.

mlambie@ubuntu:~$ sudo aptitude install unixodbc unixodbc-dev freetds-dev sqsh tdsodbc 

С установленным FreeTDS я могу настроить его так:

mlambie@ubuntu:/etc/freetds$ cat freetds.conf
[ACUMENSERVER]
  host = 192.168.0.10
  port = 1433
  tds version = 7.0

Здесь важен ACUMENSERVER - DSN, который я буду использовать при подключении к базе данных. Хост и порт говорят сами за себя, и стоит отметить, что мне пришлось использовать 7.0 именно как версию tds.

Тестирование FreeTDS не слишком сложно:

mlambie@ubuntu:~$ sqsh -S ACUMENSERVER -U username -P password
sqsh: Symbol `_XmStrings' has different size in shared object, consider re-linking
sqsh-2.1 Copyright (C) 1995-2001 Scott C. Gray
This is free software with ABSOLUTELY NO WARRANTY
For more information type '\warranty'
1> use acumen
2> go
1> select top 1 firstname, lastname from tblClients
2> go

[record returned]

(1 row affected)
1> quit

Далее необходимо настроить ODBC:

mlambie@ubuntu:/etc$ cat odbcinst.ini
[FreeTDS]
Description     = TDS driver (Sybase/MS SQL)
Driver          = /usr/lib/odbc/libtdsodbc.so
Setup           = /usr/lib/odbc/libtdsS.so
CPTimeout       =
CPReuse         =
FileUsage       = 1

mlambie@ubuntu:/etc$ cat odbc.ini
[ACUMENSERVER]
Driver          = FreeTDS
Description     = ODBC connection via FreeTDS
Trace           = No
Servername      = ACUMENSERVER
Database        = ACUMEN

Затем я проверил соединение с isql:

mlambie@ubuntu:~$ isql -v ACUMENSERVER username password
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL> use ACUMEN
[][unixODBC][FreeTDS][SQL Server]Changed database context to 'Acumen'.
[ISQL]INFO: SQLExecute returned SQL_SUCCESS_WITH_INFO
SQLRowCount returns -1
SQL> select top 1 firstname from tblClients;

[record returned]

SQLRowCount returns 1
1 rows fetched
SQL> quit

ОК, поэтому у нас есть ODBC, использующий FreeTDS для подключения к удаленному серверу MSSQL. Осталось только добавить в смесь Ruby.

mlambie@ubuntu:~$ sudo aptitude install libdbd-odbc-ruby

Последнее, что нужно проверить, это то, что Ruby может использовать DBI и ODBC для доступа к реальной базе данных, и это легко проверить:

mlambie@ubuntu:~$ irb
irb(main):001:0> require "dbi" 
=> true
irb(main):002:0> dbh = DBI.connect('dbi:ODBC:ACUMENSERVER', 'username', 'password')
=> #<DBI::DatabaseHandle:0xb7ac57f8 @handle=#<DBI::DBD::ODBC::Database:0xb7ac5744
@handle=#<odbc::database:0xb7ac576c>, @attr={}>, @trace_output=#</odbc::database:0xb7ac576c><io:0xb7cbff54>,
@trace_mode=2>
irb(main):003:0> quit

И более полный тест (только с SQL SELECT, обратите внимание):

#!/usr/bin/env ruby

require 'dbi'
db = DBI.connect('dbi:ODBC:ACUMENSERVER', 'username', 'password')
select = db.prepare('SELECT TOP 10 firstname FROM tblClients')
select.execute
while rec = select.fetch do
  puts rec.to_s
end
db.disconnect
</io:0xb7cbff54>

Отсюда (чтобы исправить, что библиотека odbc находится в неправильном месте): http://ubuntuforums.org/showthread.php?t=433435&page=2

libtdsodbc.so
with freeTDS (freetds-dev, tdsodbc), you can either edit the path in the odbcinst.ini file for the [FreeTDS] driver section OR cp the /usr/lib/odbc/libtdsodbc.so into /usr/lib/libtdsodbc.so.

в любом случае работает при доступе к mssql из приглашения

isql -v $dsn $user $passwd

я нашел это полезным

http://www.unixodbc.org/doc/FreeTDS.html#Configuration

А затем в файле database.yml:

development:
  adapter: sqlserver
  mode: odbc
  dsn: dsn_name
  username: my_username
  password: my_password
2 голосов
/ 16 июня 2009

Это шаги, которые я собрал для Centos 5.3. Мне понадобилось много проб и ошибок, чтобы заставить это работать. Это от полностью чистой установки Centos.

Установка EPEL:

rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-3.noarch.rpm

Установка ruby, rubygems, freetds, unixODBC, инструментов разработки:

yum install gcc
yum install freetds
yum install ruby-devel
yum install unixODBC-devel
yum install ruby rubygems

Установка направляющих:

gem install rails

Установить связанные с БД гемы:

gem install dbd-odbc
gem install rails-sqlserver-2000-2005-adapter -s http://gems.github.com

Скачать, собрать и установить ruby-odbc:

wget http://www.ch-werner.de/rubyodbc/ruby-odbc-0.9997.tar.gz
tar zxvf ruby-odbc-0.9997.tar.gz
cd ruby-odbc-0.9997
ruby extconf.rb
make
make install

Окончательный список драгоценных камней:

# gem list

*** LOCAL GEMS ***

actionmailer (2.3.2)
actionpack (2.3.2)
activerecord (2.3.2)
activeresource (2.3.2)
activesupport (2.3.2)
dbd-odbc (0.2.4)
dbi (0.4.1)
deprecated (2.0.1)
rails (2.3.2)
rails-sqlserver-2000-2005-adapter (2.2.17)
rake (0.8.7)

Вы можете использовать различные инструменты, такие как isql, для проверки вашего ODBC-соединения. В публикации Брайана это подробно освещено, поэтому я не буду повторяться. В rails вам нужен database.yml, который выглядит примерно так:

development:
  adapter: sqlserver
  mode: odbc
  dsn: dsnName
  username: username
  password: password
1 голос
/ 20 ноября 2012

В Ubuntu я использую FreeTDS и гем activerecord-sqlserver-adapter.

Вы можете установить FreeTDS через apt:

sudo apt-get install freetds

И добавьте это в свой Gemfile:

gem 'activerecord-sqlserver-adapter'

Мне пришлось изменить настроенный номер версии FreeTDS в /etc/freetds/freetds.conf на 8.0, чтобы все работало правильно.

[global]
    tds version = 8.0

activerecord-sqlserver-адаптер на GitHub

Проект FreeTDS

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...