eager loading doesnt end circular chains properly

Issue #355 resolved
Mike Bayer repo owner created an issue

test case, with eager loads set in both directions:

from sqlalchemy import *
dburi = "put your own here"

import logging
#logging.getLogger("sqlalchemy.orm.mapper.Mapper").setLevel(1)
#logging.getLogger("sqlalchemy.orm.strategies.EagerLoader").setLevel(1)
#uncomment if you want to see what exactly is going on

engine = create_engine('sqlite://', strategy='plain', echo=True)
metadata = BoundMetaData(engine)

middle = Table('middle', metadata,
    Column('id', Integer, primary_key = True, autoincrement=True),
    Column('data', String(50)),
)

left = Table('left', metadata,
    Column('id', Integer, ForeignKey(middle.c.id), primary_key=True),
    Column('tag', String(50), primary_key=True),
)

right = Table('right', metadata,
    Column('id', Integer, ForeignKey(middle.c.id), primary_key=True),
    Column('tag', String(50), primary_key=True),
)

class Middle(object):
    def __init__(self, data): self.data = data
class Left(object):
    def __init__(self, data): self.tag = data
class Right(object):
    def __init__(self, data): self.tag = data

mapper(Left, left)
mapper(Right, right)
mapper(Middle, middle, properties = {
    'left': relation(Left, lazy=False, backref=backref('middle',lazy=False)),
    'right': relation(Right, lazy=False, backref=backref('middle', lazy=False)),
    }
)

def make_data():
    session = create_session(bind_to=engine)
    p = Middle('test1')
    p.left.append(Left('tag1'))
    p.right.append(Right('tag2'))
    session.save(p)
    session.flush()

def test(close_session):
    session = create_session(bind_to=engine)
    obj = session.query(Left).get_by(tag='tag1')
    if close_session:
        session.close()
    print obj.middle.right[0](0)

if __name__=="__main__":
    metadata.create_all()
    try:
        make_data()
        test(False) # fails
#        test(True) # will fail
    finally:
        metadata.drop_all()

Comments (1)

  1. Log in to comment