たとえばTurboGearsのmodel.pyに以下のようなコードを書くとする。
from sqlobject import * from sqlobject.inheritance import InheritableSQLObject from turbogears.database import PackageHub hub = PackageHub("atomic") __connection__ = hub class Atom(InheritableSQLObject): title = UnicodeCol() class AtomSub(Atom): about = UnicodeCol()
「tg-admin sql create」して「tg-admin shell」でシェルに入る。
In [1]:hub.begin() Out[1]:<sqlobject.dbconnection.Transaction object at 0x1632d10> In [2]:Atom(title="atom") # Atomなインスタンスを作る Out[2]:<Atom 1 title=u'atom'> In [3]:AtomSub(title="atomsub",about="about") # AtomSubなインスタンスを作る Out[3]:<AtomSub 2 about=u'about' title=u'atomsub'> In [4]:hub.commit() # コミット In [5]:for item in Atom.select(): # Atomなクラスをselect ...: print type(item) ...: <class 'atomic.model.Atom'> # これは当然として... <class 'atomic.model.AtomSub'> # <-- ココ,ココ!!
Atomをselectして帰ってきたクラスが,ちゃんとサブクラスになってる。atomなファーストクラス風のクラスを定義しておくと,リレーションとかも抽象化できる。まるでRDBMS使っている気がしないのがすげえな。
しかも,この機能はSQLObjectが頑張って実現しているので,SQLiteでもMySQLでもPostgreSQLでも利用可能。色んな妄想がふくらむなあ。もうZODB要らない感が漂う金曜の午後。
DjangoのO/R Mapperとか,ActiveRecordってこういうことできるのかな。。。