Ruby/DBI でデータベース操作の記述を抽象化する

Ruby/DBI をインストールする

すでに MySQL/Ruby がインストールされているものとする。

#gem search --remote dbi

*** REMOTE GEMS ***

Bulk updating Gem source index for: http://gems.rubyforge.org/
dbi (0.4.0)
dbi-dbrc (1.1.4, 1.1.3, 1.1.2, 1.1.1, 1.1.0, 1.0.1, 1.0.0)
m4dbi (0.6.0, 0.5.0)

# gem install dbi

dbd-mysql をインストールする

MySQL に接続するので、アダプタのdbd-mysql をインストールする。

# gem install dbd-mysql

接続テストを行う

require 'rubygems'
require 'dbi'

dns      = 'DBI:Mysql'
hostname = 'localhost'
database = 'mysql'
username = 'yourname'
password = 'yourpassword'

begin
  # MySQL に接続をする
  dbh = DBI.connect("#{dns}:#{database}:#{hostname}", username, password)
  sql = 'SELECT `User`, `Host` FROM `user` WHERE `Host` = ?'
  # プリペアード・ステートメントを生成する
  prepared_statment = dbh.prepare(sql)
  # プリペアード・ステートメントを実行する
  prepared_statment.execute(hostname)
  # 結果を1行ずつ取得する
  prepared_statment.each do |row|
    puts row.join(', ')
  end
  # 検索結果を開放する
  prepared_statment.finish
rescue DBI::DatabaseError => e # エラーが発生した場合、内容を表示する
  puts "[Error:#{e.err}] #{e.errstr}"

ensure # 正常終了・異常終了にかかわらず、データベースへの接続を閉じる
  dbh.disconnect if dbh
end

実行結果は下記の通り。

littlebuddha, localhost
root, localhost

Ruby/DBIMySQL/Ruby よりも便利

結果セットからフィールド名でアクセスできる。

  # 結果を1行ずつ取得する
  prepared_statment.each do |row|
    puts "#{row['User']}@#{row['Host']}"
  end

実行結果。

littlebuddha@localhost
root@localhost

また、配列のインデックス値を取得することもできる。

  prepared_statment.each do |row|
    row.each_with_index do |value, index|
      puts "#{index}: #{value}"
    end
  end

実行結果。

0: littlebuddha
1: localhost
0: root
1: localhost

フィールド名を取得したい場合は each_with_name を利用する。

  prepared_statment.each do |row|
    row.each_with_name do |value, index|
      puts "#{index}: #{value}"
    end
  end

実行結果。

User: littlebuddha
Host: localhost
User: root
Host: localhost