On Thu, Nov 28, 2019, at 4:45 AM, Carson Ip wrote: > Hi Mike, > > I have having issues letting a subclass load a parent's relationship that > configured lazy="joined". > > Let's say Engineer is a subclass of Person, and Person stores "company_id" > and has a relationship called "company" that is lazy="joined". > > Although I don't have a minimal reproducible example now, but in my setup, > let's say: > engineer = session.query(Engineer).get(1) # emits 1 query > engineer.company # emits another query > > I suspect that the subclass does not respect parent class' relationship > lazy/eager loading options.
nope, it does, no issue there so you need an MCVE > > Also I bump into this issue when identity map remembers the id's polymorphic > type. Then when I query on the base class, it emits the the subclass query > and does not load the parent class' relationship with eager load options, > which is the problem I mentioned. > engineer = session.query(Engineer).get(1) > session.commit() > person = session.query(Person).get(1) # emits 1 query > person.company # emits another query > > > > Is this by design? nope, those are the same object, if it is loading two different objects for the same id, need an MCVE, sounds like your polymorphic_discriminator is not set correctly. the query for .company is expected there because it is expired by the commit() previously. the refresh which occurs on the get() does not use a joined eager load until 1.4. > > If so, is there any way to make it respect parent class' relationship "lazy" > option? it does, need an MCVE (see the theme? :) ) > > I am not 100% certain this is reproducible in a simple example. There may be > problems in my setup that would cause this. Please let me know if this is the > case. so then you start with a simple example and then slowly modify your real program one line at a time until it looks like your simple example, each time testing to see what causes the problem. here's all your test cases from sqlalchemy import Column from sqlalchemy import create_engine from sqlalchemy import ForeignKey from sqlalchemy import Integer from sqlalchemy import String from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import relationship from sqlalchemy.orm import Session Base = declarative_base() class Company(Base): __tablename__ = "company" id = Column(Integer, primary_key=True) employees = relationship("Person", back_populates="company") class Person(Base): __tablename__ = "people" id = Column(Integer, primary_key=True) discriminator = Column("type", String(50)) company_id = Column(ForeignKey("company.id")) __mapper_args__ = { "polymorphic_on": discriminator, "polymorphic_identity": "person", } company = relationship( "Company", lazy="joined", back_populates="employees" ) class Engineer(Person): __tablename__ = 'engineer' id = Column(Integer, ForeignKey('people.id'), primary_key=True) primary_language = Column(String(50)) __mapper_args__ = { "polymorphic_identity": "engineer", } e = create_engine("sqlite://", echo=True) Base.metadata.create_all(e) s = Session(e) s.add(Company(employees=[Engineer(primary_language="java")])) s.commit() s.close() e1 = s.query(Engineer).get(1) # close so we assert no sql in the next step s.close() # no query assert e1.company is not None engineer = s.query(Engineer).get(1) s.commit() person = s.query(Person).get(1) # emits 1 query # same object assert engineer is person # s.close() # you can do this if you are on 1.4. in 1.3, the .company attr is not loaded # emits a query in 1.3 because the attribute was expired by the commit person.company > > Thanks in advance. > > -- > SQLAlchemy - > The Python SQL Toolkit and Object Relational Mapper > > http://www.sqlalchemy.org/ > > To post example code, please provide an MCVE: Minimal, Complete, and > Verifiable Example. See http://stackoverflow.com/help/mcve for a full > description. > --- > You received this message because you are subscribed to the Google Groups > "sqlalchemy" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to sqlalchemy+unsubscr...@googlegroups.com. > To view this discussion on the web visit > https://groups.google.com/d/msgid/sqlalchemy/7960faaf-50a6-4edf-b35a-4b7eda89f7d0%40googlegroups.com > > <https://groups.google.com/d/msgid/sqlalchemy/7960faaf-50a6-4edf-b35a-4b7eda89f7d0%40googlegroups.com?utm_medium=email&utm_source=footer>. -- SQLAlchemy - The Python SQL Toolkit and Object Relational Mapper http://www.sqlalchemy.org/ To post example code, please provide an MCVE: Minimal, Complete, and Verifiable Example. See http://stackoverflow.com/help/mcve for a full description. --- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To unsubscribe from this group and stop receiving emails from it, send an email to sqlalchemy+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/sqlalchemy/f71f1803-baf4-473c-895f-1f7e964837c5%40www.fastmail.com.