The lazy me you mean :) I saw that option in the documents and my comment was not regarding the complexity of the solution. I just thought that a 'load_only' method is better understood if it loads only the specified attributes.
With an abstraction layer, the user often "sees" things differently than the way they really are. For example, when I load the Foo object and I get the bars list, I don't want to care about 'bars' being a relationship (I know it is but I already handled that when I defined my model). For me, it's an attribute of type list... Of course some operations are relationship-specific but those that are not should not (IMO) force the user to consider them differently. Since I have my own wrapper around session.query, I added the following lines to it: query = session.query(model) if properties is not None: props = [p for p in properties if p in model.__table__.c] query = query.options(sa.orm.load_only(*props)) noload = set([x.key for x in model.__mapper__.relationships]) - set( props) for x in noload: query = query.options(sa.orm.lazyload(x)) ... That currently does what I want... On Thursday, December 3, 2015 at 5:23:55 PM UTC+2, Michael Bayer wrote: > > > > On 12/03/2015 10:08 AM, Mike Bayer wrote: > > > > > > On 12/03/2015 06:16 AM, Ofir Herzas wrote: > >> load_only as stated > >> in http://docs.sqlalchemy.org/en/latest/orm/loading_columns.html does > >> the following: > >> "An arbitrary set of columns can be selected as “load only” columns, > >> which will be loaded *while deferring all other columns* on a given > >> entity..." > > > > > > Hi Ofir - > > > > As it says, "on a given entity", an entity refers to a class-oriented > > object. A relationship refers to a different set of entities so these > > must be referred to independently. > > > > The "load_only" function in that code example is hyperlinked, which is > > intended to encourage the reader to click and read through the more > > detailed documentation for this function which is at: > > > > > http://docs.sqlalchemy.org/en/rel_1_0/orm/loading_columns.html?highlight=load_only#sqlalchemy.orm.load_only > > > > > > > > >> > >> However, joined relationships are not affected by this, meaning that > the > >> produced sql still joins all 'joined' relationships > >> > >> Consider the following example: > >> > >> | > >> importsqlalchemy assa > >> fromsqlalchemy.ext.declarative importdeclarative_base > >> > >> Base=declarative_base() > >> > >> classFoo(Base): > >> __tablename__ ='foo' > >> id =sa.Column(sa.Integer,primary_key=True) > >> bars =sa.orm.relationship("Bar",lazy="joined") > >> > >> classBar(Base): > >> __tablename__ ='bar' > >> id =sa.Column(sa.Integer,primary_key=True) > >> foo_id =sa.Column(sa.Integer,sa.ForeignKey('foo.id')) > >> baz =sa.Column(sa.Integer) > >> > >> e =sa.create_engine("sqlite://",echo=True) > >> session =sa.orm.Session(e) > >> session.query(Foo).options(sa.orm.load_only('id')).all() > >> | > >> > >> The query produced is the following: > >> | > >> SELECT foo.id AS foo_id,bar_1.id AS bar_1_id,bar_1.foo_id AS > >> bar_1_foo_id,bar_1.baz AS bar_1_baz > >> FROM foo LEFT OUTER JOIN bar AS bar_1 ON foo.id =bar_1.foo_id > >> | > >> > >> I understand that I can use the lazyload option to prevent the join but > >> I thought it would be nice if the load_only handled it > out-of-the-box... > > > > there's "out of the box" and there's "assuming a specific and arbitrary > > intent" - you have lazy="joined" in your mapping so if you don't want > > that to occur you need to tell the query to turn it off, load_only('a', > > 'b').lazyload('bars'). > > another thought, you'll probably like this: > > load_only('a', 'b').lazyload('*') > > > that should be easier > > > > > > > > > > > > > > > >> > >> -- > >> You received this message because you are subscribed to the Google > >> Groups "sqlalchemy" group. > >> To unsubscribe from this group and stop receiving emails from it, send > >> an email to sqlalchemy+...@googlegroups.com <javascript:> > >> <mailto:sqlalchemy+unsubscr...@googlegroups.com <javascript:>>. > >> To post to this group, send email to sqlal...@googlegroups.com > <javascript:> > >> <mailto:sqlal...@googlegroups.com <javascript:>>. > >> Visit this group at http://groups.google.com/group/sqlalchemy. > >> For more options, visit https://groups.google.com/d/optout. > > > -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To unsubscribe from this group and stop receiving emails from it, send an email to sqlalchemy+unsubscr...@googlegroups.com. To post to this group, send email to sqlalchemy@googlegroups.com. Visit this group at http://groups.google.com/group/sqlalchemy. For more options, visit https://groups.google.com/d/optout.