Ruby 言語を使い,リレーショナルデータベースを扱うプログラムを簡単に書くことが出来ます.
このページでは,組み込み型のリレーショナルデータベース管理システム SQLite バージョン 3 を使うことにする.
このページでは,Ruby プログラムの中に SQL プログラムを埋め込み,SQLite バージョン 3 上で動かします. そのための方法はいろいろありますが,ここでは,Ruby 用の dbi パッケージを使うことにします. dbi パッケージを使っているので,SQLite バージョン 3 以外のリレーショナルデータベース管理システムを使う場合でも簡単な書き換えと JDBC コネクタのインストール等の作業で済むと思います.
【Ruby on Rails との関係】
Ruby on Rails でもリレーショナルデータベースを簡単に扱うことができるが,この Web ページとは手段も目的も違っているので混同しないように.
Ruby プログラム → DBI → (JDBC) → SQLite バージョン 3 などリレーショナルデータベース管理システムのコネクタ
※ Ruby から SQLite バージョン 3 を使う方法として,sqlite3-ruby パッケージを使う方法もあります.別の Web ページで説明する.
Ruby プログラム → Active Record → activerecord_jdbcsqlite3_adapter などリレーショナルデータベース管理システムのアダプタ
SQLite 3の SQL に関する詳しい説明は:
次のソフトウェアのインストールが済んでいること.「Ruby プログラミング」の Web ページを参考にしてください.
このページでは,SQLite バージョン 3 を使うことにする. MySQL, PostgreSQL, JavaDB などでも同様の手順で行えるはずです.
使用するデータベースの名前のことを,「データベース名」と呼ぶことにする. このページでは,データベース名を,次のように書く.
データベース名は,自由に決めていいですが,半角文字(つまり英字と英記号)を使い,スペースを含まないこと. すでに存在するデータベースを使ってもいい(つまり,既存のデータベースのデータベース名を使う)し,新しいデータベースを作ることにしてもいいです.
データベースファイルが置かれるディレクトリのことです. 自由に決めていいですが,半角文字(つまり英字と英記号)を使い,スペースを含まないこと. データベース名と SQLite 3 のデータベースディレクトリとは別ものです.混同しないこと.
このページでは,SQLite 3 のデータベースディレクトリ(絶対パス形式)を 次のように書く.
C:/SQLiteDB (Windows の場合) /var/SQLiteDB (Linux の場合)
JavaDB データベースディレクトリ(絶対パス形式)は,SQLite と同様に,次のような形式になる.
C:/DerbyDatabases (Windows の場合) /var/DerbyDatabases (Linux の場合)
※ なお,データベースディレクトリは,「dbdir」 のように,相対パス形式で書く場合と,「C:/SQLiteDB」のように,絶対パス形式で書く場合があります.
データベース URL (接続文字列) は, データベース管理システムの種類によって決まる値です.
jdbc:sqlite:C:/SQLiteDB/testdb (Windows の場合) jdbc:sqlite:/var/SQLiteDB/testdb (Linux の場合)
決まり文句 jdbc:sqlite:に, SQLite 3 のデータベースディレクトリ(絶対パス形式)と, データベース名を付けます.
jdbc:mysql://localhost:3306/testdb
決まり文句 jdbc:mysql:に, データベース名などを付けます.
jdbc:postgresql:testdb
決まり文句 jdbc:postgresql:に, データベース名を付けます.
jdbc:derby:C:/DerbyDatabases/testdb,create=true (Windows の場合) jdbc:derby:/var/DerbyDatabases/testdb,create=true (Linux の場合)
決まり文句 jdbc:derby:に, SQLite 3 のデータベースディレクトリ(パス形式)と, データベース名と「,create=true」を付けます.「create=true」はデータベースが存在しないときは,接続時に自動生成するということ.
MySQL, PostgreSQL などでは,データベース管理システムに接続するためにするために使う一般ユーザのアカウント(ユーザ名とパスワード)を作成しておくこと.
SQLite, JavaDB では不要です.
JDBC ドライバ (Java クラス名) は, データベース管理システムの種類によって決まる値です.
org.sqlite.JDBC
com.mysql.jdbc.Driver
org.postgresql.Driver
org.apache.derby.jdbc.EmbeddedDriver
org.firebirdsql.jdbc.FBDriver
JDBC jar ファイルをダウンロードし,分かりやすいディレクトリに置く. このページでは,次のディレクトリに置くことにします.
C:\Program Files\Java (Windows の場合) /usr/java (Linux の場合)
ダウンロード手順は別のページで説明している.
ダウンロード手順は別のページで説明している.
http://jdbc.postgresql.org/ から入手できる.
Java DB (Derby) のインストールのときに,Eclipse プラグインもインストールしますが,その中に Java DB 用 JDBC の jar ファイルが含まれています.
ダウンロード手順は別のページで説明している.
先に ruby を最新のものに更新したいので,コンソールで, 「gem update --system」を実行する.
■ Windows の場合の実行例
エラーメッセージが出ていないことを確認する.
「gem list --remote dbd」を実行
JDBC 用のデータベース・ドライバをインストールしたい場合は 「gem install dbd-jdbc --include-dependencies」を実行
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 での実行結果の例
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 3の設定 # 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
Ruby の中に埋め込まれた SQL による問い合わせの実行例は下記の通り.
Ruby でプログラムを作るときの要点は:
SELECT * FROM commodities;
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 3の設定 # 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 ) # SQL を用いた問い合わせ sql = <<SQL SELECT * FROM commodities; SQL dbh.execute(sql) do |sth| pp sth.fetch_all end dbh.commit dbh.disconnect
【実行結果の例】
SELECT * FROM commodities WHERE type = 'orange';
上記の Ruby プログラムの「SELECT * FROM commodities; 」のところを 「SELECT * FROM commodities WHERE type = 'orange';」に書き換え
【実行結果の例】
SELECT * FROM commodities WHERE price > 25;
上記の Ruby プログラムの「SELECT * FROM commodities; 」のところを 「SELECT * FROM commodities WHERE price > 25;」に書き換え
【実行結果の例】
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;」に書き換え
【実行結果の例】
結果は長くなるので,一部分だけを載せています.