土曜日 2 21, 2009

DB自体の話が最近多くなってきたので、アプリ層のことも少し書いてみようと思います。
今回はプログラミング言語RubyからMySQLにアクセスするベーシックなプログラムを作ってみようと思います。最低限の要素が入っているようなものを作成したいと思います。

1. Rubyのインストール
今回はお手軽版ということで、以下を使ってみました。
One-Click Ruby Installer 186-26 Final Release
ダウンロードはこちらからできます

Rubyの既成バイナリは色々な種類があるのですが、その中でも1クリックでインストール出来てしまうと評判のものを今回使っています。ウィザード付のバイナリです。

インストール先にc:\rubyを指定しました。

2.MySQL/Rubyのインストール
Rubyのインストールが完了したら、MySQL-gemをインストールします。
以下のコマンドをc:\ruby\binから発行します。

gem install mysql -v 2.7.3

C:\ruby\bin>gem install mysql -v 2.7.3
Select which gem to install for your platform (i386-mswin32)
 1. mysql 2.7.3 (mswin32)
 2. Skip this gem
 3. Cancel installation
> 1
Successfully installed mysql-2.7.3-mswin32
Installing ri documentation for mysql-2.7.3-mswin32...
Installing RDoc documentation for mysql-2.7.3-mswin32...
While generating documentation for mysql-2.7.3-mswin32
... MESSAGE:   Unhandled special: Special: type=17, text="<!--
... RDOC args: --op C:/ruby/lib/ruby/gems/1.8/doc/mysql-2.7.3-
(continuing with the rest of the installation)

One-Click Ruby Installerはウィザードだけではなく、色々なWindows用バイナリも既にインストールされています。
gem listで、ローカルgemを確認すると良いと思います。

3. MySQLのbinフォルダを環境変数PATHに通しておきます。
別にインストールしてあるMySQLのbinをパスに通しておきます。c:\mysql5.1\binなどになります。

4. MySQLのテーブルを作っておきます。
MySQLサーバが起動していなければ起動します。
rubyという名前のデータベースをutf8キャラクタセット指定で作成します。mysqlクライアントプログラムを使用します。

C:\MySQLComm5.1.31\bin>mysql -uroot -p
create database ruby character set utf8
use ruby

次に以下のようなitemテーブルを作成します。
CREATE TABLE item (
  id int NOT NULL,
  name varchar(100) DEFAULT NULL,
  price decimal(10,0) DEFAULT NULL,
  times timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (id));

テーブルには適当にデータを入力しておきます。今回はこんな感じに入れてみました。

*************************** 1. row ***************************
   id: 1
 name: 南イタリア産ブラッドオレンジ
price: 350
times: 2009-02-20 23:00:54
*************************** 2. row ***************************
   id: 2
 name: 奥久慈完熟りんご
price: 250
times: 2009-02-20 23:01:18
*************************** 3. row ***************************
   id: 3
 name: 沖縄産有機パイナップル
price: 500
times: 2009-02-20 23:01:38
3 rows in set (0.00 sec)

5. 適当なフォルダにmysql_app.rbという名前のテキストファイルを作成します。

6. mysql_app.rbファイルを編集します。

require "mysql"                                                 
 
dbname = "ruby"              

m = Mysql.init()
m.options(Mysql::SET_CHARSET_NAME, "cp932")
m.real_connect("localhost", "root", "adminadmin", dbname)
 
result = m.query("SELECT name,price FROM item")
while (row = result.fetch_row) != nil do            
    puts row.at(0) + "は" +  row.at(1) + "円ですよ"
end

m.close    

今回はデータに日本語が含まれているので、Windows上のコマンドラインで表示させるためAPIのキャラクタセットをcp932(Windows-SJS)に指定しています。C APIのmysql_optionsと同じ機能です(名前は違いますが)。
あとは、コネクトしてクエリを投げた後にリザルトセットをプリントしてあげます。

5.コマンドラインでrubyアプリを実行してみます。

C:\ruby\bin>ruby c:\rubydev\mysql_app.rb

結果

C:\ruby\bin>ruby c:\rubydev\mysql_app.rb
南イタリア産ブラッドオレンジは350円ですよ
奥久慈完熟りんごは250円ですよ
沖縄産有機パイナップルは500円ですよ

Rubyはインタプリタなのでめんどくさいコンパイルが必要ありません。
Textエディタでプログラムを変更したらすぐに実行できます(あたりまえですが・・・)

そのうちJRuby on Rails/MySQLも書きたい思います。

This blog copyright 2009 by naokitakemura