2014-09-22 130 views
0

背景

我有一个具有3级依赖表的现有数据库。这里我给出一个3级连接表的示例,我无法解决的继承映射问题。不幸的是我无法改变数据库设计。在SqlAlchemy中映射多级别类继承层次结构

问题

如果我执行:

entities = session.query(Entity) 
for ent in entities: 
    print ent.isin 

我得到的错误:

AttributeError: 'Asset' object has no attribute 'isin' 

然而,下面的代码执行罚款:

entities = session.query(Entity) 
for ent in entities: 
    print ent.composition 

问题

所以属性composition可以访问,但是不是isin!?!?

它似乎很明显的是,类EntityAsset被映射,但不Listed。为什么会这样?

我会认为sqlalchemy将能够映射到任意深度的继承。

我已阅读文档,尝试了一切,我很难过。请帮忙。

继承映射

class Entity(Base): 
    __tablename__ = 'entity' 

    id = Column(Integer, primary_key=True) 
    name = Column(String) 
    entity_type = Column('type',String) 
    source_table_id = Column(Integer) 

    __mapper_args__ = { 
     'polymorphic_identity':'entity', 
     'polymorphic_on':entity_type, 
     } 


class Asset(Entity):  
    __tablename__ = 'asset' 

    id = Column('entity_id',Integer, ForeignKey('entity.id'), primary_key=True) 
    asset_type = Column('type',String) 
    asset_class = Column('class',String) 
    composition = Column(String) 

    __mapper_args__ = { 
     'polymorphic_identity':'asset', 
     'polymorphic_on':asset_type, 
     } 


class Listed(Asset): 
    __tablename__ = 'listed' 

    id = Column('asset_entity_id',Integer, ForeignKey('asset.entity_id'), primary_key=True) 
    ticker = Column(String) 
    isin = Column(String) 

    __mapper_args__ = { 
     'polymorphic_identity':'listed', 
     } 
+0

您似乎缺少'Listed'类映射参数中的'polymorphic_on'。 – mjallday 2014-09-22 18:42:44

+1

@ justin-solms:你已经在一个月内三次提出同样的问题,而且看起来没有人能帮你解决这个问题。如果你确实需要这么做,我建议你与'sqlalchemy'的创建者[Mike Bayer](http://techspot.zzzeek.org/)联系以获得建议。 – van 2014-09-23 05:16:48

回答

0

我想,也许这只是你的数据一个巧合。

您应该迭代要查看的特定类型的对象,例如,

entities = session.query(Asset) 
for ent in entities: 
    print ent.composition 

entities = session.query(Listed) 
for ent in entities: 
    print ent.isin 

或检查对象的类型,你该类型对象的访问属性之前

entities = session.query(Entity) 
for ent in entities: 
    if isinstance(ent, Asset): 
     print ent.composition 
    else isinstance(ent, Listing): 
     print ent.isin 

否则什么事情发生的是,你会得到实体对象将是ListingAsset对象。如果您对属性isin进行硬编码,则在处理Asset对象时它会中断,因为Asset对象没有isin属性。

相关问题