ActiveRecordでSQLiteを操作する

ActiveRecordRuby on Railsで使われているO/Rマッパです。
ActiveRecordを使うことによって、DBの操作が簡単になります。

今回の例では以下のディレクトリ構成で説明します。





インストール



gem install sqlite3-ruby
gem install activerecord
gem install rake


テーブルを用意する


DBのバージョン管理が出来るMigrationを使います。

Rakeファイルを作成する


Rakefile

require 'rubygems'
require 'active_record'
require 'logger'

# データベースに接続する
ActiveRecord::Base.establish_connection(
:adapter => 'sqlite3',
:dbfile => 'db/test.sqlite'
)

# ログを出力する(あると便利)
ActiveRecord::Base.logger = Logger.new(STDOUT)

task :migrate do
# 最初の引数にはRakefileから見たmigrationファイルが置いてあるディレクトリを指定する。
ActiveRecord::Migrator.migrate('migrate', ENV["VERSION"] ? ENV["VERSION"].to_i : nil)
end


migrationファイルを作成する


migrate/001_init_db.rb

# クラス名はファイル名と合わせる
# 001_init_db.rb -> InitDb
class InitDb < ActiveRecord::Migration

# データベースのバージョンを上げる処理を書く
def self.up
# テーブルを作成する
# 引数のテーブル名は複数形にする
create_table(:tests) do |t|
# テーブルにカラムを追加する
# カラム名, 型, オプション
t.column :text, :string, :null => false
t.column :num, :int
end
end

# データベースのバージョンを下げる処理を書く
def self.down
# テーブルを削除する
drop_table :battle_records
end

end


rakeする



rake migrate
もしくは
rake migrate VERSION=1


これでデータベースにtestsというテーブルが出来ます。
ちなみに、主キーとしてidというカラムが自動的に追加されます。

データベースを操作する


テーブルの準備が出来たら、実際にデータベースを操作してみます。
sample.rb

require 'rubygems'
require 'active_record'

# データベースに接続する
ActiveRecord::Base.establish_connection(
:adapter => 'sqlite3',
:dbfile => 'db/test.sqlite'
)

# テーブルのモデルクラスを作成する
# クラス名はテーブル名の単数形にする
class Test < ActiveRecord::Base
# 実験のためにto_sメソッドを定義する
def to_s
# 変数へのアクセスはカラム名でOK
return "text = #{text}, num = #{num}"
end
end

# テーブルにレコードを追加する
r = Test.new
r.text = '実験中だよ'
r.num = 100
r.save

# テーブルの内容を取得して表示する
tests = Test.find(:all).each do |test|
put test.to_s
end


まとめ



# requireするもの
require 'rubygems'
require 'active_record'

# DBに接続する方法
ActiveRecord::Base.establish_connection(
:adapter => 'sqlite3',
:dbfile => 'db/test.sqlite' # データベースファイル名
)

# テーブルに要素を追加する方法
test = Test.new
test.text = 'おちょめちょめ'
test.num = 10
test.save

# 実は以下の書き方もOK
Test.create( :text => 'おちょめちょめ', :num => 100 )

# テーブルの要素を取得する方法
tests = Test.find(:all).each do |test|
#処理
end


findには色々なオプションが用意されています。詳しくはドキュメントを参照してください。

参考


橋本商会:RailsなしでActiveRecordだけ使って、SQLiteを読み書きする
chaotic valkyrie:Rails を使用しない ActiveRecord + Migrate