- changed status to resolved
eager loading doesnt end circular chains properly
Issue #355
resolved
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)
-
reporter - Log in to comment
changeset:2059