概要
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