On Wed, May 22, 2019 at 1:02 AM Manoj Mokashi <[email protected]> wrote:
>
> Hi Michael,
>
> It would be nice to have something like options(filterrelated(relation, 
> filter))
> That way, since the join is already specified in the relation, we don't have 
> to add it again.
> Or is that difficult due to lazyloading ?

hi there -

you're responding to a message that is 11 years old.   Can you start
from scratch and specify what you are looking for?

"filterelated" as you describe would appear to correspond to:


query(Thing).outerjoin(Thing.relationship).filter(Thing.something ==
'bar').options(contains_eager(Thing.relationship))

that is, you are asking for three separate things, so there's three
separate methods to call.   I don't see it as straightforward from an
API perspective to add various shortcut functions that perform these
tasks in a different way since this spreads confusion.

If you'd like you make your own "filterrelated" function, do this:

def filterrelated(relation, filter):
    def transform(q):
        return 
q.outerjoin(relation).filter(filter).options(contains_eager(relation))
    return transform


then you use it like this:

my_query = my_query.with_transformation(filterrelated(relation, filter))

that way you can have the funciton you want and SQLAlchemy's official
API doesn't have to have a confusing array of functions that all do
similar yet different things.




>
> Btw, when we use contains_eager() with add_entity(), it creates two entities 
> in the output instead of just the main one.
> Is that expected ?
>
> regards,
> manoj
>
> On Thursday, March 20, 2008 at 7:53:57 PM UTC+5:30, Michael Bayer wrote:
>>
>>
>> On Mar 19, 2008, at 8:31 PM, Fotinakis wrote:
>>
>> >
>> >
>> > SELECT *
>> > FROM users
>> > LEFT OUTER JOIN
>> >         ( SELECT * FROM addresses WHERE type = 1 )
>> >         AS addresses ON users.id = addresses.uid
>> >
>> > I can do this:
>> >
>> > query =
>> > session
>> > .query
>> > (User
>> > ).add_entity
>> > (Address).outerjoin(addresses).filter(Address.type=='home')
>> >
>> > But, that filters on the entire query, not just on the joined sub-
>> > query, generating something like this:
>> >
>> > SELECT *
>> > FROM users
>> > LEFT OUTER JOIN addresses ON users.id = addresses.uid
>> > WHERE addresses.type = 1
>> > ORDER BY hosts.mac
>> >
>> > Because it's a one-to-many relationship, this query only returns the
>> > users that have a home addresses ... and _excludes_ users totally who
>> > have an address, but one that is not of type 'home'. I need it to
>> > return all users regardless (hence the LEFT JOIN) and just join
>> > addresses of type 1.
>> >
>>
>> you'd probably want to put the criterion in the ON clause:
>>
>>
>> session
>> .query
>> (User).add_entity(Address).select_from(users.outerjoin(addresses,
>> and_(Address.type=='home', Address.user_id=User.id)))
>>
>> alternatively you can shove the actual subquery in there in a few
>> ways, one of them is like this:
>>
>>      sel = addresses.select().where(Address.type=='home')
>>      session.query(User).add_entity(Address).outerjoin(('addresses',
>> sel))
>>
>> or otherwise spell out the join to the subquery using select_from()
>> again.
>>
>>
> --
> SQLAlchemy -
> The Python SQL Toolkit and Object Relational Mapper
>
> http://www.sqlalchemy.org/
>
> To post example code, please provide an MCVE: Minimal, Complete, and 
> Verifiable Example. See http://stackoverflow.com/help/mcve for a full 
> description.
> ---
> 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 https://groups.google.com/group/sqlalchemy.
> To view this discussion on the web visit 
> https://groups.google.com/d/msgid/sqlalchemy/f10335a2-9b95-4f1c-881b-03202d697121%40googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.

-- 
SQLAlchemy - 
The Python SQL Toolkit and Object Relational Mapper

http://www.sqlalchemy.org/

To post example code, please provide an MCVE: Minimal, Complete, and Verifiable 
Example.  See  http://stackoverflow.com/help/mcve for a full description.
--- 
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 https://groups.google.com/group/sqlalchemy.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/sqlalchemy/CA%2BRjkXFmGu8vUR4%3D88vP%2BZ%3Dvi-bgOjPwCgx6r912XX_MF6-VOQ%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to