DataMapper

DataMapperは「Ruby向けの統一データストアインターフェース」として開発された、複数のデータストアに対する統一的なAPIを提供するORMライブラリでした。MySQL、PostgreSQL、SQLiteだけでなく、Facebook(FQL経由)、Salesforce API、Amazon S3など多様なデータストアをサポートし、シンプルで直感的なクエリ構文を特徴としていました。しかし、現在はプロジェクトが終了しており、後継プロジェクトのRuby Object Mapper (ROM)への移行が推奨されています。

ORMRubyパターン統一インターフェースデータストア終了プロジェクト

GitHub概要

datamapper/dm-core

DataMapper - Core

スター751
ウォッチ26
フォーク153
作成日:2009年1月26日
言語:Ruby
ライセンス:MIT License

トピックス

なし

スター履歴

datamapper/dm-core Star History
データ取得日時: 2025/7/17 10:32

ライブラリ

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の基本セットアップ(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の使用を検討してください。