素のRubyでMySQLクエリの結果を取得する

Ruby+MySQLの処理をする時、たいていはMySQL操作系のライブラリでruby-mysqlmysql2とかを使うケースが多いのだろうが、それらのライブラリなしの素のRuby環境でMySQLのクエリ操作を行う必要があったので、その際に書いたソースを汎用化してまとめてみた。まぁ…ほとんどニーズはないかもしれんが、一応TIPSとして共有化しておこうかと。

mysql_query.rb

db = { :db_config => "~/.user.cnf", :db_name => "database_name" }

query = "SELECT * FROM db_table_name WHERE primary_key_id = 1;"
res = `/usr/bin/mysql --defaults-extra-file=#{db.fetch(:db_config)} -D #{db.fetch(:db_name)} -e \"#{query}\" `

if res.empty? then
    p "data is none."
else
    lines = res.split("\n")
    columns = lines.first.split("\t")
    results = []
    lines.each_with_index { |line, i| 
        if i > 0 then
            tmp_hash = {}
            values = line.split("\t")
            values.each_index { |j| 
                if values[j].match(/^\d+$/) then
                    tmp_hash[columns[j]] = values[j].to_i
                else
                    tmp_hash[columns[j]] = values[j].to_s
                end
            }
            results << tmp_hash
        end
    }
    p results
end

やってることは、コマンドラインでMySQLのクエリを発行しているのと同義で、標準出力としてのMySQLクエリの結果をRuby側で取り込んでハッシュにパースしているだけです。 なお、MySQL5.6からコマンドラインにパスワードを付与してmysqlコマンドを実行すると警告が出てしまうので、MySQLへの接続は.user.cnfのファイルに書いて、そっちからインポートするようにしている。

.user.cnf

[client]
user = <MySQLのユーザー名>
password = <MySQLのログインパスワード>
host = <MySQLのホスト名(RDSのエンドポイント等)>

で、実行すると、

$ ruby mysql_query.rb
[{"primary_key_id"=>1, "column_name1"=>11, "column_name2"=>2, "column_name3"=>"e76a76ec", "column_name4"=>"medium", "column_name5"=>"a", "column_name6"=>"2316e746", "column_name7"=>"1.0.0", "datetime"=>"2014-09-29 10:41:35", "status"=>"done", "description"=>"NULL"}]
$ 

と、MySQLのクエリ実行結果が、カラム名がキーとなったハッシュを要素とした配列で返ってくる。 クエリを引数化して関数化すると簡易的なCRUDとしても使えるかもしれん…が、やっぱりほとんどニーズがないだろうな(^_^;