more specific check for recursion in joinedload w no joined_depth

Issue #2481 resolved
Mike Bayer repo owner created an issue
--- a/lib/sqlalchemy/orm/strategies.py  Fri May 04 23:18:52 2012 -0400
+++ b/lib/sqlalchemy/orm/strategies.py  Tue May 08 13:49:50 2012 -0400
@@ -951,7 +951,7 @@
                     if len(path) / 2 > self.join_depth:
                         return
                 else:
-                    if self.mapper.base_mapper in reduced_path:
+                    if self.mapper in path:
                         return

             clauses, adapter, add_to_collection, \

Comments (5)

  1. Mike Bayer reporter

    test case:

    from sqlalchemy import *
    from sqlalchemy.orm import *
    from sqlalchemy.ext.declarative import declarative_base
    
    Base= declarative_base()
    
    engine = create_engine('sqlite:///:memory:', echo=True)
    
    class PersistentObject(Base):
        __tablename__ = 'persistent'
        id = Column(Integer, primary_key=True)
    
    class Movie(PersistentObject):
        __tablename__ = 'movie'
        id = Column(Integer, ForeignKey('persistent.id'), primary_key=True)
        director_id = Column(Integer, ForeignKey('director.id'))
        title = Column(String)
    
    class Director(PersistentObject):
        __tablename__ = 'director'
        id = Column(Integer, ForeignKey('persistent.id'), primary_key=True)
        movies = relationship("Movie", foreign_keys=Movie.director_id)
        name = Column(String)
    
    Base.metadata.create_all(engine)
    
    session = Session(engine)
    rscott = Director(name=u"Ridley Scott")
    alien = Movie(title=u"Alien")
    brunner = Movie(title=u"Blade Runner")
    rscott.movies.append(brunner)
    rscott.movies.append(alien)
    session.add_all([alien, brunner](rscott,))
    session.commit()
    
    session.close_all()
    d = session.query(Director).options(joinedload('*')).first()
    assert len(list(session)) == 3
    
  2. Mike Bayer reporter
    • changed status to open
    • removed status

    failure:

    from sqlalchemy import *
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy.orm import Session, relationship, backref
    
    e = create_engine('sqlite:///', echo=True)
    Base = declarative_base()
    Base.metadata = MetaData(e)
    
    
    class Item(Base):
        __tablename__ = 'items'
    
        id = Column(Integer, primary_key=True)
        item_type = Column(String(24), default='item')
    
        __mapper_args__ = {
            'polymorphic_identity': 'item',
            'polymorphic_on': 'item_type',
            'with_polymorphic': '*',
            }
    
    class PolyItem(Item):
        __tablename__ = 'poly_items'
    
        id = Column(Integer, ForeignKey(Item.id), primary_key=True)
    
        __mapper_args__ = {
            'polymorphic_identity': 'polyitem',
            }
    
        item = relationship(Item, lazy=False)
    
    if __name__ == '__main__':
        Base.metadata.create_all()
    
        session = Session(e)
    
        session.query(Item).first()
    
  3. Log in to comment