Webアプリに欠かせないデータベース関係の処理をお試しで書いてみたいと思います。

rubyからDBにアクセスするには、

  • DBネイティブなライブラリ
  • DBI等のベンダ非依存のライブラリ。(‘等の’とか言ってますがDBI以外知りません)
  • ActiveRecord等の高機能O/Rマッパー

なんてのが使えるかと思います。ネイティブライブラリはちょっと拡張性にかけるし、O/Rラッパーは大げさなので、DBIを使ってみようかと思います。

DBMSもsqlite,mysql,postgresqlとか色々使えるようですが、お手軽なsqliteにします。

DBMS(sqlite3)の準備

いつ入れたかわからないけど既に入ってました。

1
2
3
4
C:\>sqlite3
SQLite version 3.5.6
Enter ".help" for instructions
sqlite> .quit

だいぶ古いけど、まぁ問題が出たらバージョンアップする方向で。

最新版はこちらから。

rubyライブラリの準備

先ずはsqlite3用のライブラリ

DBI使う場合でもネイティブライブラリは必要なのです。gemでインストールします。

1
2
#> gem install sqlite3
#> gem install sqlite3-ruby

つぎにデータベースへのアクセスをある程度抽象化してくれるというDBIというライブラリ

こちらもgemで。

1
2
#> gem install dbi
#> gem install dbd-sqlite3

dbd-sqlite3はsqliteとdbiの仲を取り持つライブラリらしい。

eclipseにDB開発ツールをインストールしてSQLite用に仕立てる

eclipseのプラグインで

Kepler – http://download.eclipse.org/releases/kepler

“Database Development”

をインストールしときます。

かつては違う名前だったような気がしますが、同じようなことできれば何でも良いんです。

さらにSQLite用のJDBCドライバも必要です。

SQLiteやOracleから公式なドライバは提供されて無いっぽいんで、このへんからダウンロード(sqlite-jdbc-3.7.2.jar)して適当なフォルダにコピーします。

Preference->Data Management->Connectivity->Driver Definitionで”Add”

Name/TypeタブのVendor FilterでSQLiteを選んで、下のリストからSQLite JDBC Driverを選択。

JAR Listタブで”Add JAR/Zip”。ダウンロードしたjarファイルを指定します。

Defaultで勝手に入っているjar設定(sqlitejdbc-v051.jarとかなってました)がある場合は削除しときます。

Propertiesタブで好みの既定値をセットしたら”OK”。

ちなみにConnection URLを jdbc:sqlite:D:\var\SQLiteDB とかしてみました。

データベース作成

SQLファイルと接続設定

rubyプロジェクトにsqlってフォルダを作って、”sqlite3.sql”ファイルを作ります。

sqlファイルを開くとSQL File Editorで開くので、こんな感じのSQLを書きました。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
DROP TABLE ToDo;

CREATE TABLE ToDo(
    id          INTEGER PRIMARY KEY AUTOINCREMENT,   --surrogate key
    item_name   TEXT,
    memo        TEXT,
    QTY         INTEGER,
    done        INTEGER NOT NULL DEFAULT 0,
    update_time INTEGER NOT NULL DEFAULT CURRENT_TIMESTAMP
);
INSERT INTO ToDo ( item_name , memo ,  QTY) VALUES ('リンゴ','なるべく赤いの',3);
INSERT INTO ToDo ( item_name , memo ,  QTY) VALUES ('卵','12個入りの',1);
INSERT INTO ToDo ( item_name , memo ,  QTY) VALUES ('チョコ系お菓子','お好みで',1);

エディタ上で右クリックして、”Set Connection info”を選びます。

Database Server Type:SQLITE_3.5.9

Connection Frofile Nameで”Create”->SQLiteで Name: RubySQLiteTest -> Next

Database: RubySQLiteTest

Database Location: D:\var\SQLiteDB\RubySQLiteTest.sqlite3 で

こんな感じの設定で

“Finish”

エディタのダイアログはこんな感じ。

SQL実行

エディタ上で右クリックして、”Execute All”で実行されます。

実行結果

実行結果は実行するると勝手に表示されますが、Insertされたデータなんかを見るにはData Source Explorerなるウインドウを表示します。

Window->Show View->Other…->Data Management->Data Source Explorer

Database Connectionに先ほど作った接続定義があるはずなんで、掘り進んでいってEditで表示(と編集)ができます。

Rubyからアクセス

やっとこさ本題のRubyからのアクセスです。

前回作ったお試しプロジェクトにDBITest.rbを追加します。

eclipseからgemでインストールしたライブラリを参照

eclipseからgemなライブラリを参照しとかないと、コード補完が利きませんのでソッコーで参照させます。

Window->Preeferences->Ruby->Interpreters->Interpreter system librariesに

C:\Ruby200-x64\lib\ruby\gems\2.0.0\gems

を追加。

コード書く

ここまでで帰りたくなってきますが、やっとコードです。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
require 'rubygems'
require 'dbi'

dbh=DBI.connect("DBI:SQLite3:D:/var/SQLiteDB/RubySQLiteTest.sqlite3")

dbh.select_all( 'select * from ToDo' ) do |row|
  print " #{row['item_name']} #{row['memo']} #{row['QTY']}\n"
end

dbh.disconnect

結果は

1
2
3
リンゴ なるべく赤いの 3
 卵 12個入りの 1
 チョコ系お菓子 お好みで 1

自分が物知らないだけなんですが、MS系の開発環境(VSとかSQL Managementとか)に慣れてると、eclipseとかrubyとかメジャーどころですら、環境設定に要らん手間が多くて疲れますな。

Macとかならまた違うのか?