Ruby on Railsが巨大すぎてよくわからないので、とりあえずRailsの中で使われているO/RマッパであるActiveRecordだけ使ってみた。

SQLを使ってオブジェクト指向で書くとき、SQL文を発行して受け取った返り値の配列をオブジェクトに突っ込み直してやらなければならないんだけど、O/R mappingを使うとSQLのデータベースとそこに接続しているプログラム上のオブジェクトが同期できる。

もちろん、プログラム側のオブジェクトで save()などすればSQLのINSERT文が発行されるので、すぐ保存される。

■準備

環境はAMD64版Ubuntu 7.4。

ActiveRecordとSQLite3(設定とか無くて簡単なので)をインストールする

sudo apt-get install libdbd-sqlite3-ruby libsqlite3-ruby libsqlite3-dev sqlite3 ruby1.8-dev

sudo gem install activerecord sqlite3-ruby

今回はokTwitterへのUpdateを保存したり、読み出したりする例。

今回保存するのは

・text(postされたupdateの本文)

・time(postされた時刻)

の2つだけ。

■DBに接続する

table等を作る必要はない。

先にmkdir dbしておいて、

#!/usr/bin/ruby
require’rubygems
require’active_record’
ActiveRecord::Base.establish_connection(
:adapter=>’sqlite3′,
:dbfile=>’db/oktwitter’
)

dbfileに :memory: を指定すると、ファイルに保存せずにメモリ上で試せる。

MigrationというRailsでのDBのバージョンを管理するしくみを使って、tableを作る。

参考:Class: ActiveRecord::Base

classUpdatesInit defself.up
create_table(:updates){|t|
t.column:text,:string,:limit=>200,:null=>false
t.column:time,:int,:null=>false
}
end
defself.down
drop_table:updates
end
end

upの中でcolumnの型を指定しておく。ちなみに自動的にidというcolumnができて、主キーになっている。

UpdatesInit.migrate(:up)

するとDBができる。(2回やる必要はない)

テーブルを消すのもできる

UpdatesInit.migrate(:down)

で、さっそく保存してみる。



■DBに書き込む

DBとマッピングするためのmodelのクラスを宣言しておく。ActiveRecord::Baseを継承する。

classUpdate defto_s
return"#{id}@#{time}:#{text}"
end
end

ActiveRecord::Baseから継承されたcreateメソッドを呼ぶと、SQLのINSTERT文が発行されて既に保存されている。

Update.create(
:text=>message,
:time=>Time.now.to_i
)

返り値はupdate型なので、update = Update.create
として受けてやれば、update.timeとかupdate.idとかが呼べる。

すぐ保存したくない場合は、createではなくupdate = Update.newでインスタンスを受けて、update.save()したタイミングで保存できる。

■DBから取り出す

とりあえず今回は全件取り出す場合。

Update.find(:all).each{|update|
putsupdate.to_s
}

modelで宣言しておいたto_s関数を呼んでみた。

こんな感じで出てくる

1@1205012283: start
2@1205013157: earthquake?
3@1205013495: おそらくDBファイルのpermissionが間違ってたはず。これで直るはず。
4@1205013572: 直りました。復活します。
5@1205014558: 今日は日曜なので掃除のおばちゃんが来ません

■関連

sqliteの中身を吐き出す – shokaiの日記

ActiveRecordきもい – shokaiの日記

okTwitterでの発言をsqlite3に溜めるようにした – shokaiの日記

ActiveRecord+SQLite3でデータを保存したり取り出したり – shokaiの日記