Ruby sqlite3-ruby のさまざまな機能
Ruby 言語を使い,リレーショナルデータベースを扱うプログラムを簡単に書くことが出来ます.このページでは, 組み込み型のリレーショナルデータベース管理システム SQLite 3 を使うことにする.
- 問い合わせのメタデータ (metadata)
- 問い合わせ結果からの値の取得で属性名を用いる
- BLOB の挿入
- プレース・フォルダー (placeholder)
SQLite 3の SQL に関する詳しい説明は:
前準備
必要となるソフトウェア
次のソフトウェアのインストールが済んでいること.「Ruby プログラミング」の Web ページを参考にしてください.
- Ruby のインストール
- sqlite3-ruby パッケージのインストール
あらかじめ決めておく事項
使用する SQLite 3のデータベースのデータベースファイル名を決めておくこと. このページでは,次のように書く.Ruby の流儀で,Windows の場合は「\」のことを「\\」と書く.
- データベースファイル名: C:\\SQLite\\testdb
データベースファイルは,自由に決めてよいが,半角文字(つまり英字と英記号)を使い,スペースを含まないこと,
問い合わせのメタデータ (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
【実行結果の例】
問い合わせ結果からの値の取得で属性名を用いる
問い合わせ結果は,デフォルトでは「{"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
【実行結果の例】
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
【実行結果の例】
プリペアード・ステートメント (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