読者です 読者をやめる 読者になる 読者になる

かもメモ

自分の落ちた落とし穴に何度も落ちる人のメモ帳

Ruby mysql2のメモ

Ruby MySQL

RubyMySQLとデータのやり取りをしたいと思いました。
gemで探すとライブラリがヒマラヤ程たくさん出ててどれが良いのか良く解りませんでした。。。


こちらの記事を参考に、とりあえずmysql2を使ってみましたのでメモ

データを取ってきてループして表示させる

require "mysql2"

# database 接続
$client = Mysql2::Client.new(
  :host     => HOST_NAME,
  :username => DB_USER,
  :password => DB_PASSWORD,
  :database => DATABASE_NAME
)

sql = %{
  SELECT * FROM #{$table}
}
res = $client.query(sql) # resはMysql2オブジェクト

res.each{|row|
  p row # 各レコードが `{ key => value}` 形式のオブジェクトになっている
}

prepared statement

prepared statementがサポートされてる。けど、使えるのは?だけで:nameみたいに名前をつけたりはできないっぽい。
Prepared statement support by nyaxt · Pull Request #289 · brianmario/mysql2 · GitHub

Prepared statements are supported, as well. In a prepared statement, use a ? in place of each value and then execute the statement to retrieve a result set. Pass your arguments to the execute method in the same number and order as the question marks in the statement.

statement = @client.prepare("SELECT * FROM users WHERE login_count = ?")
result1 = statement.execute(1)
result2 = statement.execute(2)

statement = @client.prepare("SELECT * FROM users WHERE last_login >= ? AND location LIKE ?")
result = statement.execute(1, "CA")

データを1件だけとってくる

idを指定して1件だけデータを取ってくるようなパターン
.firstを使うと最初のレコードが取得できるので、1件しか取れないと決まっているような時はわざわざ.eachで回さなくてもOK。

def getDataByID(id)
  sql = %{
    SELECT * FROM #{$table} WHERE id = ?
  }
  stmt = $client.prepare(sql)
  res = stmt.execute(id) # resはMysql2オブジェクト

  # 取得したデータの最初の1件を返す
  res.first
end

追加したデータのidを返す

AUTO_INCREMENTのidがあるようなテーブルにデータを追加した時に追加したデータのidを取得したい。
$client.last_idを使う。

def addData(name, age)
  sql = %{
    INSERT INTO #{$table} (name, age) VALUES (?, ?)
  }
  stmt = $client.prepare(sql)
  res = stmt.execute(name, age) # res は nil

  # 最後に追加したレコードのidを返す
  $client.last_id
end

※ idがないようなテーブルだと常に0が返るっぽい。
 
 
結局、RubyMySQLを使うナウいライブラリって何なのでしょう???
ルビーオンレールズとか使えって話なのですかね。やっぱり、


[参考]

作りながら学ぶRuby入門 第2版

作りながら学ぶRuby入門 第2版