When you eager load from a class to itself, this is a self-referential eager load. A generic lazy="joined" needs to know the depth at which you'd like to go when this occurs, otherwise it will stop as soon as it sees itself in the path of classes to be joined. The behavior of joinedload('*') is the same as setting lazy="joined" on the relationship - it's not the same as saying joinedload(Director.movies), which it would take to mean as an explicit, single joined load.
In this case, even though this is from a base class to itself, the subclass is different, so perhaps the check for self-referential joining needs to be tuned. that is ticket #2481. Here, if you must use joinedload('*') and not regular joinedload(Director.movies) (I'd never use '*' with joinedload, add a new relationship and your app grinds to a halt), then add a join depth to the relationship (sorry, this is relationship(), I don't know how to set this with Elixir): movies = relationship("Movie", foreign_keys=Movie.director_id, join_depth=2) On May 8, 2012, at 8:58 AM, alex wrote: > Hi all, > > I want to use session.query(...).options(joinedload('*')) to load all > related objects eagerly. > > It seems not to work if inheritance is involved. > This is a complete working example using SQLAlchemy 0.7.7 and Elixir > 0.8.0dev: > --------------------- > from elixir import * > from sqlalchemy import create_engine > from sqlalchemy.orm import joinedload > > engine = create_engine('sqlite:///:memory:', echo = False) > metadata.bind = engine > > class PersistentObject(Entity): > pass > > class Movie(PersistentObject): > title = Field(Unicode(30)) > director = ManyToOne('Director', inverse = "movies") > > class Director(PersistentObject): > name = Field(Unicode(60)) > movies = OneToMany('Movie', inverse = "director") > > setup_all(True) > > 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.commit() > > print "without joinedload" > session.close_all() > d = session.query(Director).first() > for i in session: print i > print "with joinedload" > session.close_all() > d = session.query(Director).options(joinedload('*')).first() > for i in session: print i > > ------------------ > > The last line should also print the movies, which does not happen. > When you set Entity as the baseclass of Movie and Director it works. > Is this a bug or is there a reason I don't see? > > Thx in advance, > alex > > -- > You received this message because you are subscribed to the Google Groups > "sqlalchemy" group. > To post to this group, send email to sqlalchemy@googlegroups.com. > To unsubscribe from this group, send email to > sqlalchemy+unsubscr...@googlegroups.com. > For more options, visit this group at > http://groups.google.com/group/sqlalchemy?hl=en. > -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalchemy@googlegroups.com. To unsubscribe from this group, send email to sqlalchemy+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en.