ruby-dbi から MS SQLServer に接続する

ruby-dbi を使うときのメモのはずが汎用的な説明になってるメモ。

linux から SQLServer に接続するときは、ODBC 経由が一般的なようです。

unixODBC と FreeTDS をインストールすれば、とりあえずは OK。

こんな感じでつながります。

 +---------------------+             +---------------------+
 | Linux               |             | Windows Server      +
 +---------------------+             +---------------------+
 + FreeTDS             | --------->  | SQLServer           |
 +---------------------+             +---------------------+
 + unixODBC            |
 +-----------+---------+
 + dbd(ODBC) | その他  |
 +-----------+---------+
 + dbi                 |
 +---------------------+
 + ruby                |
 +---------------------+
 + アプリ               |
 +-------------------- +

FreeTDS の準備

  • $HOME/.freetds.conf
    • 接続先の SQLServer の情報とかをここに書きます。

unixODBC の準備

  • $HOME/.odbc.ini
    • ODBC 接続をするアプリに見せるデータソースの情報をここに書きます
      • データソース名(アプリに見せるもの)
      • データソース名($HOME/.freetds.conf で定義したもの)
      • 使用するドライバ名(/etc/odbcinst.ini で定義したもの)
      • ログとか
      • SQLServer上の接続するデータベース名

設定の確認

isql コマンドが使えます。

testserver 上のお試し用 SQLServer に接続する例を以下に示します。

 myhost$ pwd
 /home/yuji
 myhost$ cat .freetds.conf 
 [global]
        tds version = 4.2
        text size = 64512

 [dbtest]
        host = 192.168.xxx.yyy
        port = 1433
        tds version = 7.0
        client charset = UTF-8
 myhost$ cat .odbc.ini 
 [ODBC Data Sources]
 testdb = hoge
 
 [testds]
 Driver       = FreeTDS
 Description  = test database server
 Servername   = dbtest
 Database     = app
 myhost$ isql testds hoge hoge -v
 +---------------------------------------+
 | Connected!                            |
 |                                       |
 | sql-statement                         |
 | help [tablename]                      |
 | quit                                  |
 |                                       |
 +---------------------------------------+
 SQL> select count(*) from EMP;
 +------------+
 |            |
 +------------+
 | 290        |
 +------------+
 SQLRowCount returns 1
 1 rows fetched
 SQL> quit

ruby-dbi からの確認

irb でさくっと確認する。

DBI.connect の接続識別子は、"dbi:ドライバ:データソース" という書き方をします。
jdbc と似たようなもんです。

 myhost$ irb -rdbi
 irb(main):001:0> dbh = DBI.connect('dbi:odbc:testds','hoge','hoge')
 => #<DBI::DatabaseHandle:0xb7b8f468 @trace_output=#<IO:0xb7cd555c>, @trace_mode=2, @handle=#<DBI::DBD::ODBC::Database:0xb7b67eb8 @attr={}, @handle=#<ODBC::Database:0xb7b67ee0>>>
 irb(main):002:0> dbh.select_all "select count(*) from EMP"
 => [[290]]
 irb(main):003:0> dbh.disconnect
 => nil
 irb(main):004:0> quit

応用 (任意の sql を実行するだけの ruby スクリプト)

require 'dbi'

dsname = 'dbi:odbc:testds'
dbuser = 'hoge'
dbpass = 'hoge'

sql = "ここにsqlを"

dbh = nil
begin
  dbh = DBI.connect(dsname, dbuser, dbpass)
  rs = dbh.select_all(sql)
  rs.each do |x|
    puts x
  end
rescue => e
  puts e
ensure
  dbh.disconnect if dbh
  dbh = nil
end