Python 在SqlAlchemy中映射多级类继承层次结构 背景

Python 在SqlAlchemy中映射多级类继承层次结构 背景,python,inheritance,sqlalchemy,hierarchy,Python,Inheritance,Sqlalchemy,Hierarchy,我有一个现有的数据库,其中包含3个级别的依赖表。这里我给出了一个三层连接表继承映射问题的示例,我无法解决这个问题。不幸的是,我无法更改数据库设计 问题 如果我执行: entities = session.query(Entity) for ent in entities: print ent.isin 我得到一个错误: AttributeError: 'Asset' object has no attribute 'isin' 但是,以下代码执行良好: entities = sess

我有一个现有的数据库,其中包含3个级别的依赖表。这里我给出了一个三层连接表继承映射问题的示例,我无法解决这个问题。不幸的是,我无法更改数据库设计

问题 如果我执行:

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
问题: 因此属性
组合
是可访问的,但不是
isin

很明显,类
实体
资产
正在映射,但未列出
。为什么会这样

我相信sqlalchemy能够映射到任意深度的继承

我读了文件,尝试了所有的方法,我被难倒了。请帮忙

继承映射
我想这可能只是与你的数据巧合

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

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

或者在访问对象类型的属性之前检查对象类型

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

否则,您将得到一个实体对象,它将是
列表
资产
对象。如果对属性
isin
进行硬编码,则在处理
资产
对象时,该属性将中断,因为
资产
对象没有
isin
属性。

对于所列
类,映射器参数中似乎缺少
多态性。@justin solms:您正在询问同一个问题在一个月内已经问了三次了,看来没有人能帮你解决这个问题。如果您真的非常需要它,我建议您与
sqlalchemy
的创建者联系,寻求建议。
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