金子邦彦研究室プログラミングRuby による Web/データベース・プログラミングRuby sqlite3-ruby のさまざまな機能

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

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

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

前準備

必要となるソフトウェア

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

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

使用する SQLite 3のデータベースのデータベースファイル名を決めておくこと. このページでは,次のように書く.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'

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

# データベースオープン
Dir.chdir( File.dirname( File.expand_path( DBNAME ) ) )
db = SQLite 3::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

【実行結果の例】

[image]

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

問い合わせ結果は,デフォルトでは「{"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'

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

# データベースオープン
Dir.chdir( File.dirname( File.expand_path( DBNAME ) ) )
db = SQLite 3::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

【実行結果の例】

[image]

BLOB の挿入

【要点】

「SQLite 3::Blob.new( ... ) )」を使う

【ソースコード】

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

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

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

# データベースオープン
Dir.chdir( File.dirname( File.expand_path( DBNAME ) ) )
db = SQLite 3::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,
    SQLite 3::Blob.new( "a\0b\0c\0d" ) )
db.execute( "insert into hoge values ( ?, ? )",
    2,
    SQLite 3::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

【実行結果の例】

[image]

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

【要点】

「SQLite 3::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'

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

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

db.close