トップページ -> 研究道具箱と教材 -> Ruby による Web/データベース・プログラミング -> JRuby や Ruby から dbi を経由して SQLite バージョン 3 を使う
[サイトマップへ]  

JRuby や Ruby から dbi を経由して SQLite バージョン 3 を使う

Ruby 言語を使い,リレーショナルデータベースを扱うプログラムを簡単に書くことが出来ます.

この Web ページでは,組み込み型のリレーショナルデータベース管理システム SQLite バージョン 3 を使うことにします.

この Web ページでは,Ruby プログラムの中に SQL プログラムを埋め込み,SQLite バージョン 3 上で動かします. そのための方法はいろいろありますが,ここでは,Ruby 用の dbi パッケージを使うことにします. dbi パッケージを使っているので,SQLite バージョン 3 以外のリレーショナルデータベース管理システムを使う場合でも簡単な書き換えと JDBC コネクタのインストール等の作業で済むと思います.

【Ruby on Rails との関係】

Ruby on Rails でもリレーショナルデータベースを簡単に扱うことができますが,この Web ページとは手段も目的も違っているので混同しないように.

SQLite の SQL に関する詳しい説明は:

SQliteが認識できる SQL について,日本語でのすばらしい説明が http://net-newbie.com/sqlite/lang.html にあります.


事前準備

必要となるソフトウエア

次のソフトウエアのインストールが済んでいること.「Ruby プログラミング」の Web ページを参考にしてください.

あらかじめ決めておく事項

使用するデータベース管理システム

この Web ページでは,SQLite バージョン 3 を使うことにします. MySQL, PostgreSQL, JavaDB などでも同様の手順で行えるはずです.

データベース論理名

使用するデータベースの名前のことを,「データベース論理名」と呼ぶことにします. この Web ページでは,データベース論理名を,次のように書きます.

(SQLite あるいは JavaDB の場合に限り)データベースディレクトリ

データベースファイルが置かれるディレクトリのことです. 自由に決めていいですが,半角文字(つまり英字と英記号)を使い,スペースを含まないこと. データベース論理名と SQLite データベースディレクトリとは別ものです.混同しないこと.

※ なお,データベースディレクトリは,「dbdir」 のように,相対パス形式で書く場合と,「C:/SQLiteDB」のように,絶対パス形式で書く場合があります.

データベース URL (接続文字列)

データベース URL (接続文字列) は, データベース管理システムの種類によって決まる値です.

一般ユーザのアカウント(ユーザ名とパスワード)

MySQL, PostgreSQL などでは,データベース管理システムに接続するためにするために使う一般ユーザのアカウント(ユーザ名とパスワード)を作成しておくこと.

SQLite, JavaDB では不要です.

JDBC ドライバ名(Java クラス名)

JDBC ドライバ (Java クラス名) は, データベース管理システムの種類によって決まる値です.

JDBC jar ファイルのダウンロード

JDBC jar ファイルをダウンロードし,分かりやすいディレクトリに置く. この Web ページでは,次のディレクトリに置くことにします.

C:\Program Files\Java (Windows の場合)
/usr/java (Linux の場合)

gem で dbi パッケージをインストール

  1. gem update --system」の実行

    先に ruby を最新のものに更新したいので,コンソールで, 「gem update --system」を実行します.

  2. gem install dbi --include-dependencies」の実行

    ■ Windows の場合の実行例

  3. インストール終了の確認

    エラーメッセージが出ていないことを確認する.


gem で JDBC 用データベース・ドライバをインストール

  1. データベース・ドライバの一覧表示

    gem list --remote dbd」を実行

  2. JDBC 用のデータベース・ドライバのインストール

    JDBC 用のデータベース・ドライバをインストールしたい場合は 「gem install dbd-jdbc --include-dependencies」を実行


SQL を用いたテーブル定義

Ruby の中に埋め込まれた SQL によるテーブルの定義の実行例は下記の通り.

テーブル定義の要点

ここでは,Rails の流儀に習って, テーブルには「id」という名前が付いた属性 を含ることにします.また id のデータ型は「INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL」に設定します.

テーブルを定義するために,次のような SQL を実行してみます. SQL を用いたテーブル定義については,「リレーショナルデータベースのデータ構造と一貫性制約の Web ページで詳しく説明しています.

CREATE TABLE products (
    id            INTEGER  PRIMARY KEY AUTOINCREMENT NOT NULL,
    product_name  TEXT     UNIQUE NOT NULL,
    type          TEXT     NOT NULL,
    cost          REAL,
    created_at    DATETIME NOT NULL );

プログラムの例

Ruby のプログラムは次のようになります.Ruby プログラムの中に SQL プログラムが埋め込まれています.

#! ruby -Ks
# coding: windows-31j
require 'pp'
require 'rubygems'
require 'dbi'

# データベース論理名 testdb と,データベースディレクトリの設定
#   Windows の場合,頭に「C:」のように,ドライブ名が付くことに注意
#   MySQL, PostgreSQL などでは,データベースディレクトリが無いので,データベース論理名をそのまま書く
# Windows, SQLite 3
# DBNAME = "C:/SQLite/testdb"
# Linux, SQLite 3
DBNAME = "/var/SQLite/testdb"

# データベース URL(接続文字列), ユーザ名,パスワード,JDBC ドライバ名
#  SQLite, JavaDB ではユーザ名とパスワードは nil
DBURL = "DBI:jdbc:sqlite:dbname=\"" + DBNAME + "\""
# DBURL = "jdbc:mysql://localhost:3306/" + DBNAME
# DBURL = "jdbc:postgresql:" + DBNAME
# DBURL = "jdbc:derby:" + DBNAME + ",create=true"
DBUSER = nil
DBPASSWORD = nil
JDBCDRIVER = "org.sqlite.JDBC"
# JDBCDRIVER = "com.mysql.jdbc.Driver"
# JDBCDRIVER = "org.postgresql.Driver"
# JDBCDRIVER = "org.apache.derby.jdbc.EmbeddedDriver"

# データベースオープン
Dir.chdir( File.dirname( File.expand_path( DBNAME ) ) )
dbh = DBI.connect(DBURL, DBUSER, DBPASSWORD, 'AutoCommit' => false, 'driver'=>JDBCDRIVER )
# SQL を用いた commodities テーブルの定義
sql = <<SQL
CREATE TABLE products (
    id            INTEGER  PRIMARY KEY AUTOINCREMENT NOT NULL,
    product_name  TEXT     UNIQUE NOT NULL,
    type          TEXT     NOT NULL,
    cost          REAL,
    created_at    DATETIME NOT NULL );
SQL
dbh.do(sql)

dbh.commit
dbh.disconnect

■ Linux での実行結果の例


SQL を用いたテーブルへの行の挿入

Ruby の中に埋め込まれた SQL によるテーブルへの行の挿入の実行例は下記の通り.

ここでは次のようなテーブルを作る.

そのために,次のような SQL を実行する.

INSERT INTO commodities VALUES( 1, 'Fukuoka apple',     'apple',  50);
INSERT INTO commodities VALUES( 2, 'Kumamoto orange L', 'orange', 30);
INSERT INTO commodities VALUES( 3, 'Kumamoto orange M', 'orange', 20);
INSERT INTO commodities VALUES( 4, 'Fukuoka melon',     'melon',  NULL);

Ruby でプログラムを作るときの要点は:

Ruby のプログラムは次のようになります.

#! ruby -Ks
# coding: windows-31j
require 'pp'

# JRuby で dbi を使うときは次のように書く(他の良い方法が思いつかない).
$LOAD_PATH.unshift("C:/jruby140/lib/ruby/gems/1.8/gems")
require 'dbi-0.4.3/lib/dbi'
# Ruby の場合
# require 'dbi'

# データベース論理名 testdb と,データベースディレクトリ C:/SQlite の設定
#   Windows の場合,頭に「C:」のように,ドライブ名が付くことに注意
#   MySQL, PostgreSQL などでは,データベースディレクトリが無いので,データベース論理名をそのまま書く
DBNAME = "C:/SQLite/testdb"

# データベース URL(接続文字列), ユーザ名,パスワード,JDBC ドライバ名
#  SQLite, JavaDB ではユーザ名とパスワードは nil
DBURL = "DBI:jdbc:sqlite:" + DBNAME
# DBURL = "jdbc:mysql://localhost:3306/" + DBNAME
# DBURL = "jdbc:postgresql:" + DBNAME
# DBURL = "jdbc:derby:" + DBNAME + ",create=true"
DBUSER = nil
DBPASSWORD = nil
JDBCDRIVER = "org.sqlite.JDBC"
# JDBCDRIVER = "com.mysql.jdbc.Driver"
# JDBCDRIVER = "org.postgresql.Driver"
# JDBCDRIVER = "org.apache.derby.jdbc.EmbeddedDriver"

# データベースオープン
Dir.chdir( File.dirname( File.expand_path( DBNAME ) ) )
dbh = DBI.connect(DBURL, DBUSER, DBPASSWORD, 'AutoCommit' => false, 'driver'=>JDBCDRIVER )
st = dbh.prepare("INSERT INTO commodities VALUES (:1, :2, :3, :4)")
# SQL を用いたテーブルへの行の挿入
st.execute( 1, 'Fukuoka apple',     'apple', 50);
st.execute( 2, 'Kumamoto orange L', 'orange', 30);
st.execute( 3, 'Kumamoto orange M', 'orange', 20);
st.execute( 4, 'Fukuoka melon',     'melon',  nil);
st.finish

dbh.commit
dbh.disconnect

SQL を用いた問い合わせ

Ruby の中に埋め込まれた SQL による問い合わせの実行例は下記の通り.

Ruby でプログラムを作るときの要点は:


テーブルの一覧表示

SQLite バージョン 3 でデータベース内のテーブル一覧を表示するには,sqlite_maste, sqlite_temp_masteという名前が付いた特別なテーブルを使います.

データベーススキーマを見たいときは,次のような SQL を実行します.

select * from sqlite_master;

※ sqlite_master, sqlite_temp_master に,DROP TABLE, UPDATE, INSERT, DELETE 操作を行うことは許されていません

上記の Ruby プログラムの「SELECT * FROM commodities; 」のところを 「SELECT * FROM sqlite_master;」に書き換え

【実行結果の例】

結果は長くなるので,一部分だけを載せています.