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

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

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

Contents

Ruby から MySQL へ接続する

ruby-mysql gem を利用します。

$ 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 を読み込みます。
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 などに変更します。

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

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

こんな形式。

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

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

$ 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

スクリプト

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

実行結果

$ ruby mysql.rb
default: 0
osi: 0
gfm: 0