2014-02-11 105 views
1

使用SQLAlchemy,我已经配置了单个表继承的类。当我查询基类时,特定的类不加载。而是只加载基类的实例。我配错了什么吗?类不会多态加载

from sqlalchemy import Column, Integer, Enum 
from sqlalchemy.dialects.postgresql import TEXT 

from sqlalchemy import MetaData, create_engine 
from sqlalchemy.orm import sessionmaker, scoped_session 

from sqlalchemy.ext.declarative import declarative_base 

info = 'postgresql+psycopg2://[email protected]:5432/panel_db' 

engine = create_engine(info) 

metadata = MetaData() 
session = scoped_session(sessionmaker(bind=engine)) 

Base = declarative_base(metadata=metadata) 

class Wave(Base): 
    """Represent a Wave.""" 

    __tablename__ = 'waves' 

    wave_id = Column(Integer, primary_key=True) 
    wave_name = Column(TEXT) 
    type = Column(Enum('emailed', 'triggered', 'anonymous', name='wave_type'), nullable=False) 

    __mapper_args = { 
     'polymorphic_on': type, 
    } 


class AnonymousWave(Wave): 

    __mapper_args__ = { 
     'polymorphic_identity': 'anonymous' 
    } 


class EmailedWave(Wave): 
    """Represents a wave that is emailed out.""" 

    __mapper_args__ = { 
     'polymorphic_identity': 'emailed', 
    } 

数据库中行是

select wave_id, wave_name, type from waves; 
wave_id |   wave_name    | type 
---------+----------------------------------+--------- 
     1 | Wave 1       | emailed 
     10 | MM 1 - client approval test  | emailed 
     2 | Wave 1       | emailed 
     3 | Wave 1       | emailed 
     4 | Wave 1       | emailed 
     5 | Wave 1       | emailed 
     6 | Wave 1       | emailed 
     7 | Wave 1       | emailed 
     8 | Wave 1       | emailed 
(9 rows) 

示例代码:

waves = session.query(Wave).all() 
from pprint import pprint 
pprint(waves) 
for wave in waves: 
    print wave.__class__.__name__ + " " + wave.type 

,其输出:

[<__main__.Wave object at 0x2324b50>, 
<__main__.Wave object at 0x2324d50>, 
<__main__.Wave object at 0x2324dd0>, 
<__main__.Wave object at 0x2324e50>, 
<__main__.Wave object at 0x2324ed0>, 
<__main__.Wave object at 0x2324f90>, 
<__main__.Wave object at 0x2329090>, 
<__main__.Wave object at 0x2329150>, 
<__main__.Wave object at 0x2329210>] 
Wave emailed 
Wave emailed 
Wave emailed 
Wave emailed 
Wave emailed 
Wave emailed 
Wave emailed 
Wave emailed 
Wave emailed 

回答

2
__mapper_args = { 
    'polymorphic_on': type, 
} 

是您的proble米

这是一个很难错字看到,但你缺少两个下划线“__”

__mapper_args__ = { 
    'polymorphic_on': type, 
}