第17回:新春O/Rマッパー対決2009
Django ORマッパー
多対多のリレーションを張るときに間のテーブルをORマッパー側で管理してくれる。
Saving
Modelのオブジェクトのsaveメソッドを呼び出しておしまい。
insert/updateを勝手に判定してくれる。
Admin
Modelから一般管理ページを生成する機能。
他
論理削除等の扱いがいい感じらしい
SQLAlchemy
特徴
- Data Mapperパターン・Active Recordパターンの両方が使える
- 大規模向き
- 同じような処理でも書き方がいくつかある
- 学習コストは3つの中で一番高い
利用されてるアプリ
- Zime
elixir
- Active Recordパターンが使える
- SQLAlchemyの拡張性の高さを生かして作られた。
Session
- 一つのDB-Connection
- Unit Of Workパターン
- データベースに影響を与えるオブジェクトへの変更をすべて記録し、作業が終了した際にすべての変更を一度にデータベースに変更する。
- Identity Map
- DBから一度読み込まれたデータオブジェクトを保持し、再度参照した際に同じものを参照した場合は
selectする時もlistに詰める場合は遅延評価されるので、
Pythonコード中で何度queryを呼んでも、
実際に必要になるまでSQLが発行されない。
逆にeagerloadを使えば関連するものを事前に取っておける。
SQL式言語
メソッドチェーンでSQLを生成して実行できる。
Pythonでは演算子オーバーロードができるので、
.where(user_table.c.id < 10000)の括弧の中は、
booleanではなく条件を表すオブジェクト、という風にできる。
他
ほとんどのORMはレコード追加時のデフォルト値の設定をアプリ側でしかできない。
SQLAlchemyも普通はアプリ側でやるが、DBサーバ側でやらせるような定義もできる。
関連テーブルは自分で定義しないといけない(Djangoとの違い)
質疑応答
- Data Mapperのいいところは何か?
- DBのスキーマが複雑すぎる場合はEntityを定義するのが大変
- 既存のDBがある場合は
- 1Modelで複数tableとかもできるらしい