Doge log

Abby CTO 雑賀 力王のオフィシャルサイトです

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先生が書いてまた猛烈にはてブされるかも知れない)
うくく。