<p>我也遇到过同样的问题,发现现有的数据库orm缺乏多态性/OOP,为此,我一直在研究一个新的orm,主要集中在这方面。它叫做ORB,可以在:<a href="http://docs.projexsoftware.com/api/orb/" rel="nofollow">http://docs.projexsoftware.com/api/orb/</a></p>
<p>现在它只适用于PostgreSQL和Mongo,但是我很快会把它扩展到更多的后端。在</p>
<p>它非常灵活,取决于您要做什么,是否简单,例如:</p>
<ul>
<li>基类(数据库层)</li>
<li>子类(纯python调用-同一表运行的so控制器逻辑)</li>
</ul>
<p>或者</p>
<ul>
<li>基类(抽象层-公共控制器逻辑,未定义表)</li>
<li>子类(数据库层-每个子类定义不同的数据库表)</li>
</ul>
<p>或者</p>
<ul>
<li>基类(数据库层-定义根表)</li>
<li>子类(数据库层-为支持它的数据库定义继承的表,为不支持的数据库定义重复的列表)</li>
</ul>
<p>下面是一个例子:</p>
<pre><code># import the orb system
from orb import Table, Column, ColumnType, Orb
# define the base class (will create default_fruit table)
class Fruit(Table):
__db_columns__ = [
Column(ColumnType.String, 'shape'),
Column(ColumnType.String, 'color'),
Column(ColumnType.String, 'name'),
Column(ColumnType.String, 'classType')
]
def initRecord( self ):
"""
Set the initialization information from the base Table type
"""
super(Fruit, self).initRecord()
self.setRecordDefault('classType', self.__class__.__name__)
@staticmethod
def expanded( records ):
"""
Expands the records based on their class type.
:return [<Table>, ..]
"""
out = []
for record in records:
# map the record to their base classes
model = Orb.instance().model(record.classType())
if ( not model ):
out.append(record)
continue
expanded_record = model(record)
if ( not expanded_record.isRecord() ):
continue
out.append(expanded_record)
return out
# define the sub class (no database table)
class Apple(Fruit):
def initRecord( self ):
super(Apple, self).initRecord()
self.setRecordDefault('shape', 'round')
self.setRecordDefault('color', 'red')
# define the sub class (with a sub-table, will create default_banana table)
class Banana(Fruit):
__db_columns__ = [
Column(ColumnType.String, 'isPlantain')
]
def initRecord( self ):
super(Banana, self).initRecord()
self.setRecordDefault('shape', 'oblong')
self.setRecordDefault('color', 'yellow')
</code></pre>
<p>这将定义3个不同的类(Fruit、Apple、Banana)和2个数据库表(default_Fruit,default_Banana)</p>
<p>使用此系统(您必须创建文档中定义的数据库连接等)将给您提供以下内容:</p>
^{pr2}$