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()'
なお「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テーブルに書かれたデータが表示された。