TurboGearsが使ってるO/R MapperであるところのSQLObjectのInheritableSQLObjectは凄いよこりゃ
by
ats
—
posted at
2006-07-21 16:23
last modified
2006-07-21 23:51
たとえば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ってこういうことできるのかな。。。
- Category(s)
- python
-
- ¦
- ¦
- Permalink
- ¦
- Comment (2)
- ¦
- Trackback (0)
- The URL to Trackback this entry is:
- http://coreblog.org/ats/inheritable-sqlobject/tbping






http://code.djangoproject.com/wiki/ModelInheritance
Modelの継承は現在実装中のようです。
Wikiを見るとSQLObjectと同じような動作にはならなさそうなことが書いてあります。
どういう実装にするかきちんと追っていないので確かなことは言えませんが。
ふむふむ,URLをご紹介頂きありがとうございました:-)
どうもリレーションを使った実装になるみたいですね
今年のPythonConferenceで聞いたこと炉によると,DjangoのO/R MapperはSQLObjectにとてもインスパイアされているとのことでしたが
継承に関してはSQLObjectとちょっと違ったアプローチを取るように見えますね...