RubyとSqliteのおべんきょう

SQLite Ruby tutorial
に従ってお勉強。コード以外で引用にしてあるのは上記サイトの私訳。
リファレンスは
http://sqlite-ruby.rubyforge.org/

まずSQLiteヴァージョン表示

#!/usr/bin/ruby

require 'sqlite3'

begin
    
    db = SQLite3::Database.new ":memory:"
    puts db.get_first_value 'SELECT SQLITE_VERSION()'
    
rescue SQLite3::Exception => e 
    
    puts "Exception occured"
    puts e
    
ensure
    db.close if db
end

を試す。

mini:~ foo$ ruby version.rb
/Users/common/.rbenv/versions/1.9.3-p194/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require': cannot load such file -- sqlite3 (LoadError)
	from /Users/common/.rbenv/versions/1.9.3-p194/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
	from version.rb:3:in `<main>'

やはり標準ではライブラリ入ってない。

のでrubygemsで入れる。

mini:~ foo$ gem install sqlite3
Fetching: sqlite3-1.3.6.gem (100%)
Building native extensions.  This could take a while...
Successfully installed sqlite3-1.3.6
1 gem installed
Installing ri documentation for sqlite3-1.3.6...
unable to convert "\xC3" to UTF-8 in conversion from ASCII-8BIT to UTF-8 to US-ASCII for CHANGELOG.rdoc, skipping
Installing RDoc documentation for sqlite3-1.3.6...
unable to convert "\xC3" to UTF-8 in conversion from ASCII-8BIT to UTF-8 to US-ASCII for CHANGELOG.rdoc, skipping
mini:~ foo$ gem list

*** LOCAL GEMS ***

bigdecimal (1.1.0)
faraday (0.8.1)
io-console (0.3)
json (1.5.4)
minitest (2.5.1)
multi_json (1.3.6)
multipart-post (1.1.5)
rake (0.9.2.2)
rdoc (3.9.4)
simple_oauth (0.1.9)
sqlite3 (1.3.6)
twitter (3.4.0)

では再度。

mini:~ foo$ ruby version.rb
3.7.7

ひとまずおk。

さて。コードの理解。

まずDatabaseオブジェクトを生成する。DatabaseクラスはSQLiteデータベースとの接続を一つカプセル化する。このDatabaseオブジェクトはcloseメソッドで閉じられる。

SQLite3::Database.new dbname
SQLite3::Database.open dbname

もう一度コードを見る。

#!/usr/bin/ruby

require 'sqlite3'

begin
    
    db = SQLite3::Database.new ":memory:"
    puts db.get_first_value 'SELECT SQLITE_VERSION()'
    
rescue SQLite3::Exception => e 
    
    puts "Exception occured"
    puts e
    
ensure
    db.close if db
end

上記のスクリプトはインメモリのデータベースを作るRubyスクリプトである。SQLステートメントを実行してSQLiteデータベースのバージョンを返す。

require 'sqlite3'

sqlite3モジュールを使ってSQLiteデータベースへ接続する。

db = SQLite3::Database.new ":memory:"

データベースオブジェクトを一つ生成する。DatabaseクラスはSQLiteデータベースとの接続を一つカプセル化する。データベースはメモリ上に作られるので永続的では無い。

puts db.get_first_value 'SELECT SQLITE_VERSION()'

dbオブジェクトのget_first_valueメソッドを呼び、SQLステートメントの最初の行の最初の値を返す。

なお「SELECT SQLITE_VERSION()」のSQLステートメントの意味はこちら。
sqlite_version関数 - SQLite関数の使い方 - SQLite入門
見たままですねw

rescue SQLite3::Exception => e 
    
    puts "Exception occured"
    puts e

エラーチェック。データベースを扱う場合はエラーが出やすいのでこれは重要。

ensure
    db.close if db
end

最後にリソースをリリースする。

データ挿入

次に、Carsテーブルを作り、そこに列を挿入するスクリプトlast_rowid.rb。

#!/usr/bin/ruby

require 'sqlite3'

begin
    
    db = SQLite3::Database.open "test.db"
    db.execute "CREATE TABLE IF NOT EXISTS Cars(Id INTEGER PRIMARY KEY, 
        Name TEXT, Price INT)"
    db.execute "INSERT INTO Cars VALUES(1,'Audi',52642)"
    db.execute "INSERT INTO Cars VALUES(2,'Mercedes',57127)"
    db.execute "INSERT INTO Cars VALUES(3,'Skoda',9000)"
    db.execute "INSERT INTO Cars VALUES(4,'Volvo',29000)"
    db.execute "INSERT INTO Cars VALUES(5,'Bentley',350000)"
    db.execute "INSERT INTO Cars VALUES(6,'Citroen',21000)"
    db.execute "INSERT INTO Cars VALUES(7,'Hummer',41400)"
    db.execute "INSERT INTO Cars VALUES(8,'Volkswagen',21600)"
    
rescue SQLite3::Exception => e 
    
    puts "Exception occured"
    puts e
    
ensure
    db.close if db
end

このスクリプトではCarsテーブルを1つ作り、そこに8つの列を追加する。

db = SQLite3::Database.open "test.db"

まずtest.dbデータベースへ接続する。

db.execute "CREATE TABLE IF NOT EXISTS Cars(Id INTEGER PRIMARY KEY, Name TEXT, Price INT)"

executeメソッドは引き続くSQLステートメントを実行する。Carsテーブルが存在しなければ新しく作る。

db.execute "INSERT INTO Cars VALUES(1,'Audi',52642)"
db.execute "INSERT INTO Cars VALUES(2,'Mercedes',57127)"

このテーブルに2台の車情報を挿入する。デフォルトではautocommitモードになっており、テーブルの変更は全て直ぐに反映される。

mini:~ foo$ sqlite3 test.db       
SQLite version 3.7.7 2011-06-25 16:35:41
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .mode column
sqlite> .headers on

columnモード、ヘッダありで表示させる設定。

sqlite> SELECT * FROM Cars;
Id          Name        Price     
----------  ----------  ----------
1           Audi        52642     
2           Mercedes    57127     
3           Skoda       9000      
4           Volvo       29000     
5           Bentley     350000    
6           Citroen     21000     
7           Hummer      41400     
8           Volkswagen  21600     

Carsテーブルに書かれたデータが表示された。