8.38. SQLAlchemy Query Join — Python
Join
Select From
Multiple Joins
Outer Join
Reset Join Point
>>> q = session.query(User).\ ... join(User.addresses).\ ... filter(Address.email_address.like('%@aol.com')).\ ... options(contains_eager(User.addresses)).\ ... populate_existing()
8.38.1. Join
>>> q = session.query(User).join(User.addresses)
SELECT user.id, user.name FROM user JOIN address ON user.id = address.user_id
8.38.2. Select From
8.38.3. Multiple Joins
the order in which each call to the join() method occurs is important.
>>> q = ( ... select(User). ... join(User.orders). ... join(Order.items). ... join(Item.keywords))
8.38.4. Outer Join
8.38.5. Reset Join Point
8.38.6. Use Case - 1
>>> q = session.query(User).join(Address, User.id==Address.user_id) >>> q = session.query(User).join(Address, User.addresses)
8.38.7. Use Case - 2
>>> a1 = aliased(Address) >>> a2 = aliased(Address) >>> >>> q = session.query(User).\ ... join(a1, User.addresses).\ ... join(a2, User.addresses).\ ... filter(a1.email_address=='ed@foo.com').\ ... filter(a2.email_address=='ed@bar.com')
8.38.8. Use Case - 3
>>> a1 = aliased(Address) >>> a2 = aliased(Address) >>> >>> q = session.query(User).\ ... join(User.addresses.of_type(a1)).\ ... join(User.addresses.of_type(a2)).\ ... filter(a1.email_address == 'ed@foo.com').\ ... filter(a2.email_address == 'ed@bar.com')
8.38.9. Use Case - 4
>>> q = session.query(User).join( ... User.addresses.and_(Address.email_address != 'foo@bar.com') ... )
8.38.10. Use Case - 5
>>> subq = session.query(Address).\ ... filter(Address.email_address == 'ed@foo.com').\ ... subquery() >>> >>> q = session.query(User).join( ... subq, User.id == subq.c.user_id ... )
8.38.11. Further Reading
https://docs.sqlalchemy.org/en/stable/orm/loading_relationships.html
https://docs.sqlalchemy.org/en/stable/orm/loading_relationships.html#lazy-loading
https://docs.sqlalchemy.org/en/stable/orm/loading_relationships.html#joined-eager-loading
https://docs.sqlalchemy.org/en/stable/orm/loading_relationships.html#subquery-eager-loading
https://docs.sqlalchemy.org/en/stable/orm/loading_relationships.html#select-in-loading
https://docs.sqlalchemy.org/en/stable/orm/loading_relationships.html#what-kind-of-loading-to-use
https://docs.sqlalchemy.org/en/stable/orm/loading_relationships.html#wildcard-loading-strategies
https://docs.sqlalchemy.org/en/stable/orm/loading_relationships.html#relationship-loader-api