среда, 11 ноября 2009 г.

Доступ к MSSQL из Rails (OS X Leopard)

Настраиваем доступ из рельсов к MSSQL серверу

Ruby/Rails => ActiveRecord SQL Server Adapter => DBI Gem w/DBD-ODBC => Ruby ODBC => unixODBC => FreeTDS => MSSQL Server.

Так как мне это нужно только для временого доступа к разным серверам то я использую проброс портов через ssh
$ ssh -L 1433:mssqlserver.mydomain:1433 login@myhost
поэтому вместо имени сервера я использую localhost

для начала ставим xcode с установочного диска и ports
или обновляем
$ sudo port selfupdate
Все настройки я описываю для ruby 1.8.7
Проверяем версию руби
$ ruby -v
и обновляем при необходимости
$ sudo port install ruby
ставим gem
$ sudo port install rb-rubygems
теперь переходим к установке unixODBC и FreeTDS
$ sudo port install unixODBC
$ sudo port install freetds +odbc
ставим необходимые gem
$ sudo gem install dbi -v 0.4.1
$ sudo gem install dbd-odbc -v 0.2.4
$ sudo gem install activerecord-sqlserver-adapter
на время написания статьи необходимо подправить Portfile для rb-odbc
$ port file rb-odbc | xargs mate
Теперь в открывшемся TextMate правим
0.9995 на 0.9997
и соответственно правим MD5 на 36d21519795c3edc8bc63b1ec6682b99

у меня получилось
# $Id: Portfile 30250 2007-10-23 02:16:17Z jmpp@macports.org $
PortSystem 1.0
PortGroup ruby 1.0

ruby.setup {odbc ruby-odbc} 0.9997 extconf.rb {README doc test}
maintainers nomaintainer
description An extension library for ODBC from ruby.
long_description Extension library to use ODBC data sources from Ruby. \
Supports Ruby 1.6.x and 1.8 on Win32 OSes and UN*X
checksums md5 36d21519795c3edc8bc63b1ec6682b99
homepage http://www.ch-werner.de/rubyodbc
master_sites http://www.ch-werner.de/rubyodbc
categories-append databases
platforms darwin

variant utf8 {
configure.args-append -Cutf8
}

После сохранения файла можно ставить ruby ODBC
$ sudo port install rb-odbc +utf8
Теперь настраиваем FreeTDS
$ mate /opt/local/etc/freetds/freetds.conf
я добавил в конец файла
[my_dev_server]
host = localhost # я использую проброс портов
port = 1433
tds version = 8.0
port = 1433
client charset = UTF-8 # у меня серваки отдают win1251 а в рельсах utf-8
После этого настраиваем unixODBC
$ sudo cp /opt/local/etc/odbc.ini.dist /opt/local/etc/odbc.ini
$ sudo cp /opt/local/etc/odbcinst.ini.dist /opt/local/etc/odbcinst.ini
$ mate /opt/local/etc/odbcinst.ini
вставляем
[FreeTDS]
Decscription = FreeTDS driver for SQLServer
Driver = /opt/local/lib/libtdsodbc.so
Setup = /opt/local/lib/libtdsodbc.so
FileUsage = 1
теперь очередь за настройкой DSN
$ mate /opt/local/etc/odbc.ini
вот например мой
[my_dev_server_dsn]
Driver=FreeTDS
Description=My Server Connection
Servername=my_dev_server
Server=my_dev_server
Port=1433
Database=mssql-database
теперь очередь за database.yml в приложении
например
development-mssql:
adapter: sqlserver
mode: ODBC
username: user
password: secret
database: mssql-database # возможно достаточно настроек dsn
dsn: my_dev_server_dsn


Все работает.
На самом деле я использую модель и rake task для импорта данных в рельсовое приложение т.е. только на этапе разработки.

Комментариев нет: