トップページ -> 情報工学,情報スキルの教材 -> Ruby による Web/データベース・プログラミング -> Ruby sqlite3-ruby のさまざまな機能
[サイトマップへ]  

Ruby sqlite3-ruby のさまざまな機能

Ruby 言語を使い,リレーショナルデータベースを扱うプログラムを簡単に書くことが出来ます.この Web ページでは, 組み込み型のリレーショナルデータベース管理システム SQLite3 を使うことにします.

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

Ruby から SQLite を使う方法については:

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


事前準備

必要となるソフトウエア

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

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

使用する SQLite のデータベースのデータベースファイル名を決めておくこと. この Web ページでは,次のように書きます.Ruby の流儀で,Windows の場合は「\」のことを「\\」と書きます.


問い合わせのメタデータ (metadata)

問い合わせ結果の各列の属性名とデータ型の取得

【要点】

db.execute(sql) do |row|
    p row.fields
    p row.types
    ...
end

【ソースコード】

#! ruby -Ks
# coding: windows-31j

require 'pp'
require 'rubygems'
require 'sqlite3'

# SQLite3 のデータベースファイル名を DBNAME に設定してください.
# Windows の場合は「\\」で区切る
DBNAME = "C:\\SQLite\\testdb"
DBDIR = File.dirname( DBNAME )
DBBASENAME = File.basename( DBNAME )

# データベースオープン
Dir.chdir( File.dirname( File.expand_path( DBNAME ) ) )
db = SQLite3::Database.new( DBNAME )
# SQL による問い合わせ
sql = <<SQL
SELECT * FROM commodities;
SQL
# db.execute(...) do |row| ... end は,結果が複数の行になるときの決まり文句
db.execute(sql) do |row|
    p row.fields
    p row.types
    p row
end

db.close

【実行結果の例】


問い合わせ結果からの値の取得で属性名を用いる

問い合わせ結果は,デフォルトでは「{"1", "Fukuoka apple", "apple", "50.0"}」のような Array になっているので,個々の値は配列の添字(つまり数字)を使って取得することができる.一方で,属性名を使って値を取得することもできる.

【要点】

db.results_as_hash = true
db.execute(sql) do |row|
    p row['属性名']
end

【ソースコード】

#! ruby -Ks
# coding: windows-31j

require 'pp'
require 'rubygems'
require 'sqlite3'

# SQLite3 のデータベースファイル名を DBNAME に設定してください.
# Windows の場合は「\\」で区切る
DBNAME = "C:\\SQLite\\testdb"
DBDIR = File.dirname( DBNAME )
DBBASENAME = File.basename( DBNAME )

# データベースオープン
Dir.chdir( File.dirname( File.expand_path( DBNAME ) ) )
db = SQLite3::Database.new( DBNAME )
# SQL による問い合わせ
sql = <<SQL
SELECT * FROM commodities;
SQL
# db.execute(...) do |row| ... end は,結果が複数の行になるときの決まり文句
db.results_as_hash = true
db.execute(sql) do |row|
    p row['type']
end

db.close

【実行結果の例】


BLOB の挿入

【要点】

「SQLite3::Blob.new( ... ) )」を使う

【ソースコード】

#! ruby -Ks
# coding: windows-31j

require 'pp'
require 'rubygems'
require 'sqlite3'

# SQLite3 のデータベースファイル名を DBNAME に設定してください.
# Windows の場合は「\\」で区切る
DBNAME = "C:\\SQLite\\testdb"
DBDIR = File.dirname( DBNAME )
DBBASENAME = File.basename( DBNAME )

# データベースオープン
Dir.chdir( File.dirname( File.expand_path( DBNAME ) ) )
db = SQLite3::Database.new( DBNAME )
# SQL によるテーブル定義
sql = <<SQL
DROP TABLE hoge;
CREATE TABLE hoge (
  id  INTEGER PRIMARY KEY NOT NULL,
  bin BLOB );
SQL
#
db.execute_batch(sql);

# BLOB を挿入するために変数を使う必要がある.
db.execute( "INSERT INTO hoge VALUES ( ?, ? )",
    1,
    SQLite3::Blob.new( "a\0b\0c\0d" ) )
db.execute( "INSERT INTO hoge VALUES ( ?, ? )",
    2,
    SQLite3::Blob.new( "\0\1\2\3\4\5\6\7\8\9" ) )

# SQL による問い合わせ
sql = <<SQL
SELECT * FROM hoge;
SQL
# db.execute(...) do |row| ... end は,結果が複数の行になるときの決まり文句
db.execute(sql) do |row|
    p row
end

db.close

【実行結果の例】


プリペアード・ステートメント (prepared statement)

【要点】

「SQLite3::Blob.new( ... ) )」を使う

【ソースコード】 書きかけ


プレースフォルダー (placeholder)

問い合わせ結果の各列の属性名とデータ型の取得

【要点】

db.execute(sql) do |row|
    p row.fields
    p row.types
    ...
end

【ソースコード】

#! ruby -Ks
# coding: windows-31j

require 'pp'
require 'rubygems'
require 'sqlite3'

# SQLite3 のデータベースファイル名を DBNAME に設定してください.
# Windows の場合は「\\」で区切る
DBNAME = "C:\\SQLite\\testdb"
DBDIR = File.dirname( DBNAME )
DBBASENAME = File.basename( DBNAME )

# データベースオープン
Dir.chdir( File.dirname( File.expand_path( DBNAME ) ) )
db = SQLite3::Database.new( DBNAME )
# プレースフォルダーを含む SQL
db.execute("INSERT INTO commodities VALUES( :id, :name, :type, :price )",
  5, "Oita Orange S", "orange", "35" )

db.close