1
class Base(DBO):
    __tablename__ = 't'
    __mapper_args__ = {'polymorphic_on': 'typ'}
    id = Column(Integer, primary_key=True)
    typ = Column(String)

class ChildA(Base):
    __mapper_args__ = {'polymorphic_identity':'a'}

class ChildB(Base):
    __mapper_args__ = {'polymorphic_identity':'b'}

S.query(Base).all()

これは、テーブル内のすべての typ='a' および typ='b' に対してうまく機能しますが、ポリモーフィック ローダーが 'c' に遭遇したとします。

私が望むのは、不明な PMI の Base() のインスタンスを取得することです。現在、次のエラーが発生します。No such polymorphic identity 'c' is defined

編集:SA 0.8.0b2を使用

4

1 に答える 1

4
from sqlalchemy import *
from sqlalchemy.orm import *
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class Root(Base):
    __tablename__ = 't'
    id = Column(Integer, primary_key=True)
    typ = Column(String)

    def __repr__(self):
        return "%s(typ=%r)" % (self.__class__.__name__, self.typ)

    __mapper_args__ = {
                'polymorphic_on': case([(typ.in_(['a', 'b']), typ)], else_='t'),
                'polymorphic_identity': 't'
                }

class ChildA(Root):
    __mapper_args__ = {'polymorphic_identity': 'a'}

class ChildB(Root):
    __mapper_args__ = {'polymorphic_identity': 'b'}

e = create_engine("sqlite://", echo=True)
Base.metadata.create_all(e)

e.execute(
        Root.__table__.insert(), [
            {'typ': 'a'},
            {'typ': 'a'},
            {'typ': 'b'},
            {'typ': 'a'},
            {'typ': 'c'},
            {'typ': 't'},
        ]
    )

print Session(e).query(Root).all()

データ挿入後の出力:

SELECT t.id AS t_id, t.typ AS t_typ, 
    CASE WHEN (t.typ IN (?, ?)) THEN t.typ ELSE ? END AS _sa_polymorphic_on 
FROM t
('a', 'b', 't')
[ChildA(typ=u'a'), ChildA(typ=u'a'), ChildB(typ=u'b'), ChildA(typ=u'a'), Root(typ=u'c'), Root(typ=u't')]
于 2013-03-12T02:12:04.963 に答える