たとえば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ってこういうことできるのかな。。。