suppose I have the following tables (in pseudo-code)

User:
* userid
* name

Thing
* thingid
* name
* userid

Thing.user = relation(User, User.userid==Thing.userid)

Now, If I have the following query:

query = 
session.query(Thing).option(joinedload('user')).join(User).filter(User.name 
== 'blah')

This is going to generate a query that's similar to the following:

SELECT thing.thingid, thing.name, thing.userid, user1.userid, user1.uname
FROM thing INNER JOIN user AS user1
INNER JOIN user
WHERE user.name = 'blah'

So sqlalchemy does not eliminate the unnecessary join here, which is fine. 
Is there a way for me to manually identify whether a table is already 
joined in the query building process? Let me elaborate:

suppose I want to separate the code for loading child objects and filtering:

def search(child, search_by):
  query = session.query(Thing)
  query = load_children(query, child)
  query = apply_filter(query, search_by)
  return query.all()

def load_children(query, child):
  return query.options(joinedload(child))

def apply_filter(query, search_by):
  return query.filter(search_by)

Now, calling
search('user', User.name=='blah')
will yield the similar query above.

Is there a way for me to inspect a query object, and see what joins are 
currently there, regardless of whether they're called by joinedload() or 
query.join()? I know query._from_object contains the join element if a 
query.join() is called, but not the case for 
query.options(joinedload('user')).

Any suggestion is appreciated.


-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To view this discussion on the web visit 
https://groups.google.com/d/msg/sqlalchemy/-/_dmCom8a_6IJ.
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.

Reply via email to