Please read Routing Explicit Joins/Statements into Eagerly Loaded Collections. Then using contains_eager
you can structure your query and get exactly what you want:
authors = (
session.query(Author)
.join(Author.books)
.options(contains_eager(Author.books)) # tell SA that we load "all" books for Authors
.filter(Book.title.like('%SQL%'))
).all()
Please note that you are actually tricking sqlalchemy into thinking that it has loaded all the collection of Author.books
, and as such your session will know false
information about the real state of the world.