このサイトについて

TurboGearsが使ってるO/R MapperであるところのSQLObjectのInheritableSQLObjectは凄いよこりゃ

TurboGearsが使ってるO/R MapperであるところのSQLObjectのInheritableSQLObjectは凄いよこりゃ

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

2010-08-27 04:40