ActiveRecordでSQLiteを操作する
ActiveRecordはRuby 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