4月 302012
MacにhomebrewでMySQL5.1.58インストールしたの続き。Ruby+DataMapperで使ってみた編。
gem install data_mapper dm-mysql-adapter
できたもの
https://github.com/shokai/datamapper-study
全体的にMongoidに似てる。Mongoidっぽい華麗なメソッドチェーンによるqueryができないっぽいのだけ残念・・
でもコード書いてて書き心地よかったし、SQL素人なのでORマッパーごしじゃないと怖くて使えない。
参考にしたページ
- DataMapper – Getting started with DataMapper
- DataMapper – Documentation
- DataMapper – Properties
- DataMapper – Finding Records
chatとかBBSみたいなのを作ろうと思ったがWebアプリにしないでCUIで使うやつにした。
ruby -Ku bin/post_comment.rb てすとでMySQLに保存して、
ruby -Ku bin/show_comments.rbで保存してあるのを読む。
ファイルの構造はこうなってる
そのうちsinatra templateに組み込むつもりで書いてみた。
. ├── Gemfile ├── Gemfile.lock ├── README.md ├── bin │ ├── console.rb │ ├── migrate.rb │ ├── post_comment.rb │ └── show_comments.rb ├── bootstrap.rb ├── config.yml ├── models │ └── comment.rb └── sample.config.yml 2 directories, 11 files
DBの設定 config.yml
db : adapter : mysql host : localhost database : study username : yourname password : xxxxxxxx
設定に書いたstudyって名前のDBをmysqlに作って、migrateしておく。
mysql -u your_name -p mysql> create database study; ruby bin/migrate.rb
model定義 models/comment.rb
Mongoidに似てる。デフォルト値はlambdaで渡すと都度計算してくれる。
class Comment include DataMapper::Resource property :id, Serial property :name, String, :required => true property :body, String, :required => true property :created_at, Time, :default => lambda{Time.now} def to_s "[#{name}] #{body} - #{created_at}" end def self.get_latests(num=10) self.all(:order => [:id.desc], :limit => num) end endクラスメソッドに「最近数件のコメントを取得」するメソッドを書いた。Query系はmodelに全部抽象的な名前で書いておいて、controllerとかにquery書かないようにすると綺麗になるし、modelだけで単体テストもできるようになる。
設定読み込んでMySQLに接続する
bootstrap.rb
#!/usr/bin/env ruby require 'rubygems' require 'bundler/setup' Bundler.require require 'yaml' begin @@conf = YAML::load open(File.dirname(__FILE__)+'/config.yml').read rescue => e STDERR.puts e STDERR.puts "config.yml load error!!" exit 1 end DataMapper.setup(:default, @@conf['db']) Dir.glob(File.dirname(__FILE__)+'/models/*.rb').each do |rb| puts "loading #{rb}" require rb end DataMapper::Logger.new($stdout, :debug) DataMapper.finalizeDataMapperにどのDBを使うか設定してからModelを読み込んで、Loggerを設定したらfinalizeする。finalizeしないとwebアプリとかで使った時に何度もDBに接続しにいったりModelの定義とかを実行してしまうらしい。
postする
bin/post_comment.rb
#!/usr/bin/env ruby require File.dirname(__FILE__)+'/../bootstrap' if ARGV.empty? puts 'error : comment required' puts "e.g. ruby #{$0} \"hello world\"" exit 1 end begin c = Comment.new(:name => `whoami`.strip, :body => ARGV.join(' ')) c.save rescue => e STDERR.puts e exit 1 end total = Comment.count Comment.get_latests(5).each do |c| puts "(#{c.id}/#{total}) #{c}" end
最近のcommentを見る
bin/show_comments.rb
#!/usr/bin/env ruby require File.dirname(__FILE__)+'/../bootstrap' total = Comment.count Comment.get_latests(20).each do |c| puts "(#{c.id}/#{total}) #{c}" end
postしたりshowした実行結果
(12/12) [sho] てすと - Mon Apr 30 13:14:10 +0900 2012 (11/12) [sho] MySQLに保存できるようになった - Mon Apr 30 00:52:25 +0900 2012 (10/12) [sho] できた!! - Mon Apr 30 00:52:06 +0900 2012 (9/12) [sho] できたのでは - Mon Apr 30 00:50:05 +0900 2012 (以下略)
あと、modelを読み込んでDB接続してIRB起動する簡単なスクリプト作っておくと、modelのメソッド試したりQuery発行できたりして便利
bin/console.rb
#!/usr/bin/env ruby require File.dirname(__FILE__)+'/../bootstrap' require 'irb' IRB.start