Accèder à une base MS SQL en ruby sous linux, avec et sans ActiveRecord
Par Martin Catty le mercredi, septembre 17 2008, 12:12 - ruby - Lien permanent
Pré-requis
Cette procédure a été testé sous une debian lenny avec un kernel 2.6.18 (et sous OSX Leopard 10.5.4).
L'objectif est donc d'accéder à une base de données Microsoft SQL Server depuis un script ruby sous GNU / Linux.
Installation des packages
L'idée est de communiquer avec la base MS SQL par le biais des librairies FreeTDS et de l'API ODBC.
On commence par installer les packages nécessaires :
aptitude install unixodbc aptitude install unixodbc-dev aptitude install sqsh
Il est possible d'installer freetds par aptitude (install freetds-dev qui installe common) mais dans mon cas il manquait le fichier libtdsodbc.so.
Je l'ai donc installé depuis les sources :
wget ftp://ftp.ibiblio.org/pub/Linux/ALPHA/freetds/stable/freetds-stable.tgz tar xzvf freetds-stable.tgz cd freetds-0.82 ./configure && make && sudo make install
Il faut maintenant définir quelques variables d'environnement définisant les emplacements des fichiers de configuration.
Soit dans le /etc/profile pour que tous les utilisateurs y ait accès, soit dans le .bashrc uniquement pour l'utilisateur courant :
export ODBCINI=/etc/odbc.ini export ODBCSYSINI=/etc export FREETDSCONF=/etc/freetds/freetds.conf
Rechargement de la configuration :
$ source /etc/profile
Configuration de la datasource
Dans le /etc/freetds/freetds.conf :
[MY_DSN] host = IP du serveur port = 1433 tds version = 7.0
MyDSN représente le nom de la datasource, on peut y mettre le nom souhaité.
On teste la connexion au datasource :
$ sqsh -S MY_DSN -U user -P password
Si tout se passe tu atteris sur un prompt de type :
1>
Il nous faut maintenant indiquer à ODBC d'utiliser FreeTDS :
$ vim /etc/odbc.ini [MY_DSN] Driver = FreeTDS Description = ODBC connection via FreeTDS Trace = No Servername = MY_DSN Database = YOUR_ACTUAL_DB_NAME
$ vim /etc/odbcinst.ini [FreeTDS] Description = TDS driver (Sybase/MS SQL) Driver = /usr/local/lib/libtdsodbc.so FileUsage = 1
On peut maintenant tester l'accès au datasource par le biais de isql, qui permet l'envoi de requêtes SQL sur le serveur :
$ isql MY_DSN user password
SQL> select top 10 * from users (pas de limit)
Note : La close top agit de la même façon que la close limit pour une base de données MySQL.
Accéder aux données MS SQL depuis ruby, sans ActiveRecord
Nous allons utiliser l'interface d'accès aux données DBI en utilisant le driver ODBC.
Il existe maintenant une gem pour ruby dbi :
# gem install dbi
Faisons un premier essai depuis un shell ruby :
$ irb
require 'rubygems'
require 'dbi'
DBI.connect('dbi:odbc:MY_DSN', login, password)
=> Unable to load driver 'odbc'
DBI ne parvient pas à charger le driver odbc. Actuellement odbc est installé sur notre machine mais il n'y a pas d'extension pour dialoguer avec.
On installe donc la librairie ODBC pour ruby :
$ wget http://www.ch-werner.de/rubyodbc/ruby-odbc-0.9995.tar.gz $ tar zvxf ruby-odbc-0.9995.tar.gz $ cd ruby-odbc-0.9995/ $ ruby extconf.rb $ make # make install
On installe le driver ODBC pour ruby dbi qui utilise odbc.so installé ci dessus :
# gem install dbd-odbc
Désormais le code testé ci dessus fonctionne.
Note : Pas besoin de require 'odbc', dbi inclus automagiquement les drivers présents.
Il est maintenant possible de faire des requêtes manuelles sans passer par AR.
Des exemples sont disponibles sur la doc officielle de ruby-dbi.
Accéder aux données MS SQL depuis ruby, avec ActiveRecord
Il faut utiliser l'adapter odbc, qui n'est plus inclus de base avec Rails :
# gem install activerecord-odbc-adapter
Une fois effectué, la syntaxe pour établir une connection est la suivante :
ActiveRecord::Base.establish_connection({ :adapter => 'odbc', :dsn => 'MY_DSN', :username => 'user', :password => 'password'})
Note : Ce tutoriel fonctionne sous OSX. Sous Leopard, les fichiers de conf odbc (odbc.ini, odbcinst.ini) doivent se situer dans/Library/ODBC.
Les packages à installer peuvent s'installer avec les port ou être directement compilés.

