君の瞳はまるでルビー - Ruby 関連まとめサイト

ruby-mysql の使い方の簡単な説明

最終更新: 2016-12-14 (水) 00:45:56 (950d)

概要

ruby-mysql は、MySQL リレーショナルデータベースにアクセスするためのライブラリの一つです。

このページでは ruby-mysql を利用してデータベースにアクセスする方法について説明します。

MySQL にアクセスするためのライブラリは多数存在し、 その他にも汎用リレーショナルデータベースアクセス用ライブラリを使ったアクセスもできるため、それらを念頭に置く必要があります。

ruby-mysql をインストールする

以下のコマンドを実行して ruby-mysql gem をインストールします。

gem install ruby-mysql

ruby-mysql で MySQL に接続する

前提としてローカルに MySQL がインストールしてあり、mysql ユーザおよびそのユーザのパスワードが設定してあると仮定します。

ruby-mysql は動作環境に MySQL がインストールされていなくても動くことを覚えていてください。例えば ClearDB のような MySQL クラウドデータベースなどの外部からアクセス可能な MySQL を利用する場合、動作環境に MySQL のネイティブコードが無くても ruby-mysql は動作します。これは Pure Ruby で書かれた ruby-mysql の長所の一つです。

以下のプログラムで MySQL に接続します。

require 'rubygems'  # Ruby 1.8 対応のため rubygems を require しているが Ruby 1.9 では不要である
require 'mysql'

connection = Mysql::new("127.0.0.1", "mysql", "mysql ユーザのパスワード", "スキーマの名前")
# connection を使い MySQL を操作する
connection.close

ruby-mysql は localhost を認識してくれません。代わりに 127.0.0.1 を使います。localhost を認識してくれないだけで、一般的なサーバ名の名前解決はしてくれるので、アドレスではなくサーバ名を使って大丈夫です。

パラメータを持つ SELECT 文を実行する

以下に事例を示します。

statement = connection.prepare("SELECT value1, value2 FROM table1 WHERE key1 = ? AND key2 = ?")
begin
  result = statement.execute(key1, key2)
  result.each do |tuple|
    puts tuple[0]  # value1 の値
    puts tuple[1]  # value2 の値
  end
ensure
  statement.close
end

既に接続が済んでいることが前提になります。

コネクションに対して prepare を呼び出すことで SQL 文を用意します。SQL 文には ? を埋め込むことでパラメータを設定できます。

パラメータの値は execute の引数で指定します。パラメータは ? の順番に合わせて指定します。

execute の戻り値の each メソッドを使うことで各行にアクセスできます。各行には配列として SELECT した項目の順序で値が入ってきます。

もしも1行だけ値を取り出したい場合は、each メソッドの代わりに fetch メソッドを使います。

statement = connection.prepare("SELECT value1, value2 FROM table1 WHERE key1 = ? AND key2 = ?")
begin
  tuple = statement.execute(key1, key2).fetch
  if tuple then
    # 行がある場合の処理
  else
    # 行がない場合の処理
  end
ensure
  statement.close
end

パラメータを持たない SELECT 文を実行する

以下に事例を示します。

result = connection.query("SELECT value1, value2 FROM table1")

パラメータを必要としない場合は、query メソッドだけで簡単に実行できます。

result の扱いは prepare & execute をした場合と同じです。

INSERT, UPDATE, DELETE 文などを実行する

同じようにできます。

INSERT/UPDATE 文実行時のキー重複は Mysql::ServerError::DupEntry 例外をキャッチすることにより検出できます。

AUTO_INCREMENT により自動発行されたキーの値は connection もしくは Statement の insert_id メソッドから取得できます。

CREATE TABLE や DROP TABLE 文などを実行する

query メソッドでできます。

トランザクションを使う

勘違いかもしれませんが、コミットとロールバック用のメソッドはあるのですが、トランザクションの開始メソッドが無いように思います。

そこで query メソッドを使ってトランザクションを開始し、コミットとロールバックには用意されている commit/rollback メソッドを使うのが良いかと思います。

connection.query("START TRANSACTION")
begin
  # connection を使い MySQL を操作する
  connection.commit
rescue => e
  connection.rollback
  raise e
end

以上の例は、例外をロールバックの条件として使った場合の方法です。

備考

packet is not EOF エラーが発生する。

原因は不明ですが -Ku オプション(Ruby が処理する文字コードを UTF-8 に設定するオプション)を付けると動かないかもしれません。

他のオプションの影響はわかりませんが、-Ku を外したら packet is not EOF は出なくなりました。

コメント

本ページの内容に関して何かコメントがある方は、以下に記入してください。

コメントはありません。 コメント/ruby-mysql/about

お名前: