DataMapper
DataMapperは「Ruby向けの統一データストアインターフェース」として開発された、複数のデータストアに対する統一的なAPIを提供するORMライブラリでした。MySQL、PostgreSQL、SQLiteだけでなく、Facebook(FQL経由)、Salesforce API、Amazon S3など多様なデータストアをサポートし、シンプルで直感的なクエリ構文を特徴としていました。しかし、現在はプロジェクトが終了しており、後継プロジェクトのRuby Object Mapper (ROM)への移行が推奨されています。
GitHub概要
datamapper/dm-core
DataMapper - Core
トピックス
スター履歴
ライブラリ
DataMapper
概要
DataMapperは「Ruby向けの統一データストアインターフェース」として開発された、複数のデータストアに対する統一的なAPIを提供するORMライブラリでした。MySQL、PostgreSQL、SQLiteだけでなく、Facebook(FQL経由)、Salesforce API、Amazon S3など多様なデータストアをサポートし、シンプルで直感的なクエリ構文を特徴としていました。しかし、現在はプロジェクトが終了しており、後継プロジェクトのRuby Object Mapper (ROM)への移行が推奨されています。
詳細
DataMapperは2013年にプロジェクトが終了し、開発チームがRuby Object Mapper (ROM)に集中することになりました。ActiveRecordとは異なるデータマッパーパターンを採用し、ドメインモデルとデータベースの関心を分離する設計でした。N+1クエリ問題の自動解決、戦略的な遅延読み込み、高度なクエリ演算子(gt、gte、not等)のサポートなど、革新的な機能を多数実装していました。しかし、メンテナンスの負担とコミュニティの分散により、プロジェクトは終了となりました。
主な特徴(歴史的)
- 統一データストアインターフェース: MySQL、NoSQL、API等への統一アクセス
- シンプルなクエリ構文:
Zoo.all(:name => 'Dallas')
のような直感的記述 - 自動戦略的遅延読み込み: N+1クエリ問題の自動解決
- 高度なクエリ演算子: gt、gte、like、not等の豊富な比較演算子
- パフォーマンス最適化: テキストフィールドのデフォルト除外
- マイグレーション機能: auto_migrate!とauto_upgrade!による柔軟なスキーマ管理
メリット・デメリット
メリット(歴史的)
- 複数のデータストアに対する統一的なAPIによる高い移植性
- ActiveRecordより直感的で読みやすいクエリ構文
- N+1クエリ問題の自動解決による優れたパフォーマンス
- データマッパーパターンによるドメインロジックとデータアクセスの分離
- 30以上のデータベースアダプターによる幅広いデータストアサポート
- 戦略的遅延読み込みによるメモリ使用量の最適化
デメリット
- プロジェクト終了: 2013年からメンテナンスが停止
- セキュリティリスク: 最新の脆弱性対応が行われていない
- 依存関係の問題: 古いRubyバージョンや他のgemとの互換性問題
- コミュニティサポート不足: 公式サポートとドキュメントの更新停止
- 学習リソースの陳腐化: 最新のRuby環境での動作保証なし
- 移行の必要性: ROM、Sequel、ActiveRecord等への移行が必要
参考ページ
- DataMapper GitHub Organization - 公式リポジトリ(アーカイブ)
- ROM - Ruby Object Mapper - 後継プロジェクト
- DataMapper - Wikipedia - プロジェクト概要
- DataMapper Tutorial - 学習リソース(歴史的)
書き方の例
歴史的なコード例(現在は非推奨)
# DataMapperの基本セットアップ(2013年以前)
gem install data_mapper
gem install dm-mysql-adapter
require 'data_mapper'
# データベース接続設定
DataMapper.setup(:default, 'mysql://username:password@localhost/database')
# モデル定義
class User
include DataMapper::Resource
property :id, Serial
property :name, String
property :email, String
property :created_at, DateTime
has n, :posts
end
class Post
include DataMapper::Resource
property :id, Serial
property :title, String
property :content, Text
property :created_at, DateTime
belongs_to :user
end
# データベーススキーマ作成
DataMapper.finalize
DataMapper.auto_migrate! # 全データ削除
# または
DataMapper.auto_upgrade! # 既存データ保持
モデル定義と基本操作(歴史的)
# 基本的なCRUD操作
# 作成
user = User.new(:name => "田中太郎", :email => "[email protected]")
user.save
# または
user = User.create(:name => "田中太郎", :email => "[email protected]")
# 読み取り
users = User.all
user = User.first
user = User.get(1) # IDで取得
# 更新
user = User.get(1)
user.name = "田中次郎"
user.save
# 削除
user = User.get(1)
user.destroy
高度なクエリ操作(歴史的)
# シンプルなクエリ構文
users = User.all(:name => "田中太郎")
users = User.all(:age.gt => 20) # 20歳より上
users = User.all(:age.gte => 20) # 20歳以上
users = User.all(:age.between => 18..30) # 18歳から30歳
users = User.all(:name.like => "%田中%") # 名前に"田中"を含む
users = User.all(:name.not => "田中太郎") # "田中太郎"以外
# 複合条件
users = User.all(
:age.gt => 18,
:name.like => "%田中%",
:order => [:name.desc]
)
# ページネーション
users = User.all(:limit => 10, :offset => 20)
# カウント
count = User.count(:age.gt => 20)
リレーション操作(歴史的)
# 関連データの取得(自動遅延読み込み)
user = User.first
posts = user.posts # 自動的にN+1問題を解決
# 関連データの作成
user = User.create(:name => "田中太郎")
post = user.posts.create(:title => "初投稿", :content => "こんにちは")
# 関連データを含む検索
posts = Post.all(:user => {:name => "田中太郎"})
# JOIN操作
posts = Post.all.joins(:user).where(:user => {:age.gt => 20})
実用例(歴史的)
# トランザクション処理
DataMapper.repository do |repository|
transaction = DataMapper::Transaction.new(repository)
transaction.within do |trans|
user = User.create(:name => "田中太郎")
post = Post.create(:title => "テスト", :user => user)
# エラーが発生した場合、自動的にロールバック
raise "エラー" if some_condition
end
end
# バリデーション
class User
include DataMapper::Resource
property :id, Serial
property :name, String, :required => true, :length => 3..50
property :email, String, :required => true, :unique => true, :format => :email_address
property :age, Integer, :min => 0, :max => 150
validates_presence_of :name
validates_uniqueness_of :email
validates_format_of :email, :with => :email_address
end
# 複数データベース対応
DataMapper.setup(:default, 'mysql://localhost/main_db')
DataMapper.setup(:logging, 'sqlite::memory:')
class User
include DataMapper::Resource
repository(:default) do
property :id, Serial
property :name, String
end
end
class LogEntry
include DataMapper::Resource
repository(:logging) do
property :id, Serial
property :message, Text
end
end
注意: 上記のコード例は歴史的な参考として掲載しています。DataMapperプロジェクトは終了しており、新規プロジェクトでの使用は推奨されません。現在のRuby開発では、ROM、Sequel、またはActiveRecordの使用を検討してください。