AxiomはOODBチックであるという事を言及している人は少ない
Axiom。通称ポテト野郎。
Axiomは
- ORM
- バックエンドはsqlite
- pythonicなquery
- twistedベース
- thread safeじゃない
こんな感じなもの。
そもそもtwistedベースなのでthread safeじゃないといってるわけです。
多分。
例が悪いけどAxiomの基本形は
from axiom.item import Item from axiom.attributes import text, reference, AND, OR from axiom.store import Store class Emp(Item): typeName = 'emp' schemaVersion = 1 name = text(indexed=True) dept = reference() class Dept(Item): typeName = 'dept' schemaVersion = 1 name = text() def emps(self): return self.store.query(Emp ,Emp.dept == self) class Desk(Item): typeName = 'desk' schemaVersion = 1 name = text() def emps(self): return self.store.query(Emp ,Emp.dept == self) def main(store): d1 = Dept(name=u"Dept1", store=store) d2 = Dept(name=u"Dept2", store=store) desk1 = Dept(name=u"Desk1", store=store) e1 = Emp(name=u"TEST A", dept=d1, store=store) e2 = Emp(name=u"TEST B", dept=desk1, store=store) e3 = Emp(name=u"TEST C", dept=d2, store=store) for emp in d1.emps(): print d1.name, emp.name for emp in desk1.emps(): print desk1.name, emp.name for emp in d2.emps(): print d2.name, emp.name if __name__ == '__main__': s = Store() s.transact(main, s) s.close()
こういった感じ。
シンプル。
このコードの場合、sqliteはin memory dbで動作。
transactionは別にどーでもいいんだけどかけてみた。
で注目すべきは
class Emp(Item): typeName = 'emp' schemaVersion = 1 name = text(indexed=True) dept = reference()
のreference()って奴。
こいつは「何かが参照しますよお」ってだけの宣言。
何かは決まってないのである。
そのため
e1 = Emp(name=u"TEST A", dept=d1, store=store) e2 = Emp(name=u"TEST B", dept=desk1, store=store) e3 = Emp(name=u"TEST C", dept=d2, store=store)
こんな風にdeptに何を突っこんでも関連可能なのである。
こーいうのってOODBっていうの?よくわかんね><
とりあえずAxiomだと関連するクラスを意識なくても良くなるわけ。
でこいつには凄い名前のAPIがあってそいつを使うとどうもあとづけでなんでも保存できるようになるっぽいらしいんだけどそれはまたあとで書く。
(あるいはIwata先生が書いてまた猛烈にはてブされるかも知れない)
うくく。