Ruby+MySQLの処理をする時、たいていはMySQL操作系のライブラリでruby-mysql
やmysql2
とかを使うケースが多いのだろうが、それらのライブラリなしの素の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としても使えるかもしれん…が、やっぱりほとんどニーズがないだろうな(^_^;