mixing selectin load on top of inline
Issue #4026
resolved
pushing the new feature beyond what was planned see how hard this would be
from sqlalchemy import Table, Column, Integer, String, ForeignKey, create_engine
from sqlalchemy.orm import Session
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class Person(Base):
__tablename__ = 'person'
id = Column(Integer, primary_key=True)
type = Column(String(50), nullable=False)
name = Column(String(50))
__mapper_args__ = {
'polymorphic_identity': 'person',
'polymorphic_on': type
}
class Manager(Person):
__tablename__ = 'manager'
id = Column(ForeignKey('person.id'), primary_key=True)
manager_name = Column(String(30))
__mapper_args__ = {
'polymorphic_identity': 'manager',
'polymorphic_load': 'selectin'
}
class EngineerBase(Person):
__tablename__ = 'engineer'
id = Column(ForeignKey('person.id'), primary_key=True)
engineer_name = Column(String(30))
__mapper_args__ = {
'polymorphic_load': 'selectin'
}
class EngineerType1(EngineerBase):
__mapper_args__ = {
'polymorphic_identity': 'engineer_t1',
'polymorphic_load': 'inline'
}
class EngineerType2(EngineerBase):
__mapper_args__ = {
'polymorphic_identity': 'engineer_t2',
'polymorphic_load': 'inline'
}
engine = create_engine('sqlite://', echo=True)
Base.metadata.create_all(engine)
engine.echo = True
session = Session(engine)
eng1 = EngineerType1()
eng2 = EngineerType2()
session.add_all([eng1, eng2])
session.commit()
session.query(Person).all()
Comments (3)
-
reporter -
reporter this seems to do it and is very simple: https://gerrit.sqlalchemy.org/450
-
reporter - changed status to resolved
Enable multi-level selectin polymorphic loading
Change-Id: Icc742bbeecdb7448ce84caccd63e086af16e81c1 Fixes:
#4026→ <<cset 68879d50faa9>>
- Log in to comment
i think we can do this, here's a patch that doesn't work yet because there's an endless loop I have to figure out how to break, but this is just a matter of identifying the right states / paths. the post-load mechanism is a lot simpler than other loader mechanisms.