使用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
答案 0 :(得分:2)
__mapper_args = {
'polymorphic_on': type,
}
你的问题。
这是一个难以理解的错误,但你错过了两个下划线'__'
__mapper_args__ = {
'polymorphic_on': type,
}