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 [email protected]
>> <mailto:[email protected]>.
>> To post to this group, send email to [email protected]
>> <mailto:[email protected]>.
>> 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 [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to