Ruby+MySQLの処理をする時、たいていはMySQL操作系のライブラリでruby-mysql
やmysql2
とかを使うケースが多いのだろうが、それらのライブラリなしの素のRuby環境でMySQLのクエリ操作を行う必要があったので、その際に書いたソースを汎用化してまとめてみた。まぁ…ほとんどニーズはないかもしれんが、一応TIPSとして共有化しておこうかと。
mysql_query.rb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
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
1 2 3 4 5 |
[client] user = <MySQLのユーザー名> password = <MySQLのログインパスワード> host = <MySQLのホスト名(RDSのエンドポイント等)> |
で、実行すると、
1 2 3 4 |
$ 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としても使えるかもしれん…が、やっぱりほとんどニーズがないだろうな(^_^;