2014-02-11 1 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, 
} 
Смежные вопросы