RubyのORMライブラリであるDataMapperをSetupしてみる。
Getting started
とりあえず公式ページのGetting startedに従って見る。PostgresはPostgres.appで入れてる状態。
postgresql用のadapterを入れる。その次に、data_mapperもinstall。
gem install dm-postgres-adapter
gem install data_mapper
使い始める前に、まずsetup。
# If you want the logs displayed you have to do this before the call to setup
DataMapper::Logger.new($stdout, :debug)
# A Postgres connection:
DataMapper.setup(:default, 'postgres://user:password@hostname/database')
Postgres.appのドキュメントを参考に、postgres://YOURUSERNAME@localhost/YOURUSERNAME
でDBに接続する。
(この時、元のドキュメントのままpostgresql://~
で接続しようとすると、dm-postgresql-adapter
をrequireしようとしてErrorが出る。コードを見てみると、dm-core/adapters.rb
の162,163行目に
162 def load_adapter(name)
163 require "dm-#{name}-adapter"
という記述がある。動的にrequireするgemを切り替えてるのが原因っぽい。)
Modelの定義について
このブログによると、indexはれるっぽい。
Stringタイプのカラムは、lengthオプションで最大長を指定出来る(デフォルトは50)。あと、lengthとしてlength: 1..200
のようにRangeを渡せば、最大、最小を指定してvalidationが出来る。
idは通常Serialタイプにする。これは、IntegerかつPrimary Keyのショートカット。別のカラムにもkey: true
オプションをつけると、そのカラムもPRIMARY KEYになる。(PostgresqlではPRIMARY KEY制約は一つのテーブルに一つしかつけられ無い為、DataMapperで複数の属性にkey制約を付けると、複数列としてのPRIMARY KEY制約がつけられる。つまり、NOT-NULL制約やUNIQE制約が複数列としてつけられ、indexも複数列インデックスと呼ばれるモノになる。複数列インデックスは(a, b, c)という組み合わせのときc単独でのindexを用いた検索が出来なくなるため、使い勝手が悪く使わない方が良い。)
間違って
4 class Page
5 include DataMapper::Resource
6
7 property :id, Serial
8 property :url, String, key: true, length: 1..200
9 property :created_at, DateTime
10 end
の様にSerialタイプのid
とkey: true
オプションを付けたurl
を定義してしまった。複数列インデックスを用いるのは嫌だったので、変わりにrequired: true
とunique_index: true
をオプションとしてつけた。
4 class Page
5 include DataMapper::Resource
6
7 property :id, Serial
8 property :url, String, required: true, unique_index: true length: 1..200
9 property :created_at, DateTime
10 end
参考
http://rubydoc.info/github/datamapper/dm-core/master/DataMapper/Property
DataMapper.finalize
でテーブル定義を確定して、DataMapper.auto_upgrade!
でmigration走らす。(DataMapper.migrate!
すると初期化&migrationで、テーブル定義をちょいちょい変更しつつデータ初期化したく無い場合はDataMapper.auto_upgrade!
すると良いっぽい)
finalizeしないと、DBとの接続を毎回行う為に効率が悪いらしい。
参考
http://datamapper.org/getting-started.html
確かにmodel定義だけでmigration走った。すごい。個人用で適当にやるならとりあえずDataMapper.auto_upgrade!
しとけば楽。(Loggerもあるのでどの時点でどういった変更をしたかはログに残せる)
KrdLab's blog
http://krdlab.hatenablog.com/entry/20090913/1252806702
http://krdlab.hatenablog.com/entry/20090517/1242564102
ってのにめっちゃ詳しく載ってる。
ファイル分割の仕方
http://blog.ruedap.com/2011/02/13/ruby-sinatra-datamapper-2-migrate-model