テクセル
RubyでMySQL(ODBC)

RubyからODBC経由でMySQL(MariaDB)を使用します。ODBCデータソースの設定及び実行環境は以下となります。

MySQL 5.5 MySQLのインストール及びmy.iniの設定例 (MariaDB10.0のインストール及びmy.iniの設定例)
ODBC Connecter/ODBC 5.3.4 Connector/ODBCのインストール例
Ruby  ruby 2.2.0p0(ActiveScriptRuby 32ビット)

データソースを指定せずに接続するには、driverConnectの接続文字列にMySQLのODBCドライバーを指定します。 「odbc.rb」の説明及びダウンロード

# coding: utf-8
# ODBC->MySQL
require "./odbc"

class MySqlOdbc < Odbc

   def initialize

      super(__ENCODING__)
   end

   def execQuery(sSQL)
   
      ir = execdirect(sSQL)
      if ir != 0
         sa = "ODBC MySQL SQL error¥r¥n" + getErr + "¥r¥n[" + sSQL + "]¥r¥n"
         print sa
         disconnect
         exit
      end
      return ir
   end

end

mysqlodbc = MySqlOdbc.new

#ir = mysqlodbc.connect("db0","root","root")

ir = mysqlodbc.driverConnect("DSN=db0;UID=root;PWD=root")

# sconstr = "DRIVER={MySQL ODBC 5.3 Unicode Driver};" +
#           "SERVER=localhost;PORT=3306;OPTION=0;STMT=SET utf-8;" +
#           "DATABASE=db0;UID=root;PWD=root"
# ir = mysqlodbc.driverConnect(sconstr)

if ir != 0
   print "接続エラー " + ir.to_s + "¥r¥n"
   exit
end
print mysqlodbc.sconstr + "¥r¥n"

sSQL = "CREATE TABLE IF NOT EXISTS tbl1 (" +
       "id int," +
       "tda datetime," +
       "cnote char(20)," +
       "PRIMARY KEY (id)," +
       "KEY key1 (tda))" +
       "DEFAULT CHARACTER SET utf8," +
       "ENGINE=MYISAM"

# MariaDBでAriaを使用する場合
#sSQL = "CREATE TABLE IF NOT EXISTS tbl1 (" +
#       "id int," +
#       "tda datetime," +
#       "cnote char(20)," +
#       "PRIMARY KEY (id)," +
#       "KEY key1 (tda))" +
#       "DEFAULT CHARACTER SET utf8," +
#       "ENGINE=Aria PAGE_CHECKSUM=1 TRANSACTIONAL=1"
mysqlodbc.execQuery(sSQL)

print "テーブル一覧¥r¥n"
ir,ardt = mysqlodbc.tableList
ardt.each{|cat, schem, name, type, rem|
   schem = "" if schem == nil
   rem  = "" if rem == nil
   print cat + "," + schem + "," + name +  "," + type + "," + rem + "¥r¥n"
}
print "¥r¥n"

print ardt[0][2] + "テーブルのカラム¥r¥n"
ir,ardt = mysqlodbc.tableColumns(ardt[0][0],ardt[0][1],ardt[0][2])
ardt.each{|arz|
   sa = ""
   arz.each{|sb|
      sb = "" if sb == nil
      sa += sb + ","
   }
print sa + "¥r¥n"
}

sSQL = "SELECT max(id) FROM tbl1"
mysqlodbc.execQuery(sSQL)
ir,ardt = mysqlodbc.getData
id = 0
if ardt.length != 0
   id = ardt[0].to_i
   id += 1
end

sSQL = "INSERT INTO tbl1 VALUES (" +
       id.to_s + ",'" +
       Time.now.strftime("%Y-%m-%d %H:%M:%S") + "'," +
       "'日本☀☃ニホン123abc')"
mysqlodbc.execQuery(sSQL)              #データ書き込み

print "データ表示¥r¥n"
sSQL = "SELECT * FROM tbl1 ORDER BY id DESC LIMIT 5"
mysqlodbc.execQuery(sSQL)
ir,ardt = mysqlodbc.describeCol
print ardt[0] + "," + ardt[1] + "," + ardt[2] + "¥r¥n"
while true do
   ir,ardt = mysqlodbc.getData
   if ir == -1
      break
   end
   print ardt[0] + "," + ardt[1] + "," + ardt[2] + "¥r¥n"
end

mysqlodbc.disconnect
print "終了¥r¥n"
Rubyユーティリティ
©2011-2016 TEXCELL CORPORATION
テクセル株式会社