I noticed that lazy loading on an n:m relation over an intermediate table on an ancestor gives the wrong results. Atached you find the test-program.
from sqlalchemy import * engine = create_engine('oracle://dsn=orcl&user=test&password=test') foo = Table('foo', engine, Column('id', Integer, Sequence('foo_seq'), primary_key=True)) bar = Table('bar', engine, Column('id', Integer, ForeignKey('foo.id'), primary_key=True)) bar_foo = Table('bar_foo', engine, Column('bar_id', Integer, ForeignKey('bar.id')), Column('foo_id', Integer, ForeignKey('foo.id')) ) class Foo(object): pass class Bar(object): pass foos = mapper(Foo, foo) bars = mapper(Bar, bar, inherits=foos) bars.add_property('bad', relation(foos, bar_foo, lazy=True)) bars.add_property('good', relation(foos, bar_foo, lazy=False)) tables = foo, bar, bar_foo for table in reversed(tables): try: table.drop() except Exception, e: print e for table in tables: try: table.create() except Exception, e: print e foo.insert().execute() bar.insert().execute(id=1) foo.insert().execute() bar.insert().execute(id=2) foo.insert().execute() #3 foo.insert().execute() #4 bar_foo.insert().execute(bar_id=1, foo_id=3) bar_foo.insert().execute(bar_id=2, foo_id=4) print len(bars.selectone().bad) #this is lazy=True and it should not print 2 but 1 print len(bars.selectone().good)