Database Access da Linux

ottobre 10, 2007

Mi sta capitando, per fortuna o per sfortuna 😉 di dover mettere le mani dentro a database access, dalla mia linux box, per migrazioni dal sistema proprietario a Database aperti (e più performanti! ^_^).

La fortuna è che mi piace fare esperienza! ^_^

Comunque, in qualche ora di ricerca ho fatto fatica a capire come usare ODBC per accedere ai dati, la parte che non ho trovato facilmente è stato come aggiungere driver e datasources (avrò usato le parole sbagliate in google… oppure non c’è molta documentazione indexata dagli spider del motore di ricerca…).

La soluzione mi è arrivata incappando in un post di una mailing list.

Per prima cosa si devono installare questi pacchetti (come riferimento uso la mia ubuntu gutsy):

sudo apt-get install libmdbodbc

Un tool grafico per sfogliare i database mdb:

sudo apt-get install mdbtools

Successivamente si deve aggiungere al file /etc/odbcinst.ini il driver (inteso come libreria condivisa) inerente al driver per MS ACCESS, così da segnalare a odbc come maneggiare i file di tipo mdb:

[MDBToolsODBC]
Description = MDBToolsODBCdrivers
Driver = /usr/lib/libmdbodbc.so.0
Usage = 1
FileUsage = 1 

Ovviamente, occhio al fatto che nella vostra distribuzione lo shared object sia in /usr/lib, sennò cambiate la stringa dopo Driver = in modo che rispecchi la posizione del file nel vostro filesystem.

Ora, supponendo che il file .mdb sia in /home/mionome/Documents/Prova.mdb si deve aggiungere questa sorgente di dati al file /etc/odbc.ini:

[Prova]
Description = Prova Sample Database
Driver = /usr/lib/libmdbodbc.so.0
Database = /home/mionome/Documents/Prova.mdb 

Ora, come prova, si può provare il comando:

isql Prova

che vi metterà in connessione con il database Access specificato nel datasource.

A questo punto, visto che ne ho bisogno in un progetto ruby, devo installare anche i bindings odbc per questo linguaggio:

sudo apt-get install libdbd-odbc-ruby

Che ci permette, sotto irb, di provare il collegamento al database dall’ambiente ruby:

require "odbc"
ODBC.drivers
ODBC.datasources
connection = ODBC.connect "Prova"

Lanciando il comando irb mi trovo nell’ambiente interattivo di ruby, molto comodo per eseguire delle prove; come prima cosa è importante il require “odbc” che carica il modulo ODBC, per sapere se ruby vede i driver e i datasource di odbc (perchè mai non dovrebbe? ^_^) ho provato a richiamare i due metodi statici: drivers e datasources che restituiscono entrambi i rispettivi array (benissimo, vedo effettivamente quelli inseriti nei due file di configurazione), per ottenere l’oggetto database, su cui poi operare attraverso i metodi elencati nelle pagine di Ruby ODBC Reference, devo fare la connessione al datasource giusto (ODBC.connect “Prova” è l’omologo in ambiente ruby di isql Prova).

A questo punto si possono provare le query:

query = connection.prepare("SELECT * FROM PROVA_TABLE")
query.execute.each_hash() { |row| print row.inspect }
query.drop
connection.drop_all