Ruby
DataMapper

DataMapperのSetupをしてみる。

More than 3 years have passed since last update.

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タイプのidkey: trueオプションを付けたurlを定義してしまった。複数列インデックスを用いるのは嫌だったので、変わりにrequired: trueunique_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