[Ruby] gems: ruby-mysql, inifile – .my.cnf の設定をロードして、Ruby から MySQL へ接続する

sql チェックを定期的に行うために、Ruby から利用する方法を調べました。

[markdown]
このあたりでやったことをチェックするスクリプトを作りたい。

> * [WordPress: MySQL を使って、Markdown on Save Improved の設定状態を確認する(1) | deadwood](https://www.d-wood.com/blog/2014/01/16_5276.html)
> * [WordPress: MySQL を使って、Markdown on Save Improved の設定状態を確認する(2) | deadwood](https://www.d-wood.com/blog/2014/01/17_5278.html)

## Ruby から MySQL へ接続する

`ruby-mysql` gem を利用します。

“`prettyprinted
$ gem update
$ gem install ruby-mysql
Fetching: ruby-mysql-2.9.12.gem (100%)
Successfully installed ruby-mysql-2.9.12
Parsing documentation for ruby-mysql-2.9.12
Installing ri documentation for ruby-mysql-2.9.12
Done installing documentation for ruby-mysql after 1 seconds
1 gem installed
“`

こんな使い方をするそう。

> * [Ruby から MySQL に接続する方法|ヘテムルレンタルサーバー](http://heteml.jp/support/manual/db-ruby-mysql/)

“`ruby
# Ruby/MySQL を読み込みます。
require ‘mysql’
# MySQL に接続します。
my = Mysql.new(‘hostname’, ‘username’, ‘password’, ‘dbname’)
# SQL クエリを実行します。
res = my.query(‘SELECT * from table_heteml’)
# 結果を表示します。
res.each do |row|
puts row[0]
end
“`

`hostname` には、`localhost` が使えないようなので、`127.0.0.1` などに変更します。

> * [MYSQLをrubyで操作するスクリプト – Qiita [キータ]](http://qiita.com/dahugani/items/0066d5b3c2471e6aa194)

## .my.cnf の設定をロードする

.my.cnf に設定している user, password, host, database の情報を読み込んで利用したい。

こんな形式。

“`prettyprinted
[client_host1]
user=myuser
password=mypass
database=dbname
host=127.0.0.1
“`

> * [MySQL: コマンドをプロンプトなしでセキュアに利用するには | deadwood](https://www.d-wood.com/blog/2013/09/16_4641.html)

`inifile` という gem で実現できそう。

> * [How to read in username/password from ".my.cnf" in Ruby MySQL driver? – Stack Overflow](http://stackoverflow.com/questions/14270169/how-to-read-in-username-password-from-my-cnf-in-ruby-mysql-driver)
> * [RubyでINIファイルを扱えるinifile gem | maeda.log](http://maeda.farend.ne.jp/blog/2012/03/05/ruby-inifile-gem/)

“`prettyprinted
$ gem install inifile
Fetching: inifile-2.0.2.gem (100%)
Successfully installed inifile-2.0.2
Parsing documentation for inifile-2.0.2
Installing ri documentation for inifile-2.0.2
Done installing documentation for inifile after 0 seconds
1 gem installed
“`

## スクリプト

“`ruby:mysql.rb
require ‘mysql’
require ‘inifile’
# 設定
mycnf = IniFile.load(‘/home/****/.my.cnf’)[‘client_host1’]
sqls = {
default: “SELECT count(*) FROM wp_posts LEFT JOIN wp_postmeta ON wp_posts.id = wp_postmeta.post_id WHERE post_type = ‘post’ AND post_status = ‘publish’ AND post_content_filtered = ” AND post_content NOT LIKE ‘%[/markdown]%’ AND meta_key = ‘_sd_is_markdown’ AND meta_value = 1;”,
osi: “SELECT count(*) FROM wp_posts LEFT JOIN wp_postmeta ON wp_posts.id = wp_postmeta.post_id WHERE post_type = ‘post’ AND post_status = ‘publish’ AND post_content_filtered != ” AND post_content NOT LIKE ‘%[/markdown]%’ AND meta_key = ‘_sd_is_markdown’ AND meta_value = ”;”,
gfm: “SELECT count(*) FROM wp_posts LEFT JOIN wp_postmeta ON wp_posts.id = wp_postmeta.post_id WHERE post_type = ‘post’ AND post_status = ‘publish’ AND post_content LIKE ‘%[/markdown]%’ AND meta_key = ‘_sd_is_markdown’ AND meta_value = 1;”
}
# MySQL に接続します。
my = Mysql.new(mycnf[‘host’], mycnf[‘user’], mycnf[‘password’], mycnf[‘database’])
sqls.each do |key, sql|
# SQL クエリを実行します。
result = my.query(sql)
# 結果を表示します。
result.each do |row|
count = row[0].to_i
print key, “: “, count, “\n” #if count > 0
end
end
my.close
“`

### 実行結果

“`prettyprinted
$ ruby mysql.rb
default: 0
osi: 0
gfm: 0
“`
[/markdown]