类不进行多态加载

时间:2014-02-11 17:39:35

标签: python postgresql sqlalchemy

使用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://panel_app@localhost: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

1 个答案:

答案 0 :(得分:2)

__mapper_args = {
    'polymorphic_on': type,
}

你的问题。

这是一个难以理解的错误,但你错过了两个下划线'__'

__mapper_args__ = {
    'polymorphic_on': type,
}
相关问题