Indicate that the given attribute should be loaded using joined eager loading. This function is part of the :class:`_orm.Load` interface and supports both method-chained and standalone operation. examples:: # joined-load the "orders" collection on "User
(
self,
attr: _AttrType,
innerjoin: Optional[bool] = None,
)
| 237 | return cloned |
| 238 | |
| 239 | def joinedload( |
| 240 | self, |
| 241 | attr: _AttrType, |
| 242 | innerjoin: Optional[bool] = None, |
| 243 | ) -> Self: |
| 244 | """Indicate that the given attribute should be loaded using joined |
| 245 | eager loading. |
| 246 | |
| 247 | This function is part of the :class:`_orm.Load` interface and supports |
| 248 | both method-chained and standalone operation. |
| 249 | |
| 250 | examples:: |
| 251 | |
| 252 | # joined-load the "orders" collection on "User" |
| 253 | select(User).options(joinedload(User.orders)) |
| 254 | |
| 255 | # joined-load Order.items and then Item.keywords |
| 256 | select(Order).options(joinedload(Order.items).joinedload(Item.keywords)) |
| 257 | |
| 258 | # lazily load Order.items, but when Items are loaded, |
| 259 | # joined-load the keywords collection |
| 260 | select(Order).options(lazyload(Order.items).joinedload(Item.keywords)) |
| 261 | |
| 262 | :param innerjoin: if ``True``, indicates that the joined eager load |
| 263 | should use an inner join instead of the default of left outer join:: |
| 264 | |
| 265 | select(Order).options(joinedload(Order.user, innerjoin=True)) |
| 266 | |
| 267 | In order to chain multiple eager joins together where some may be |
| 268 | OUTER and others INNER, right-nested joins are used to link them:: |
| 269 | |
| 270 | select(A).options( |
| 271 | joinedload(A.bs, innerjoin=False).joinedload(B.cs, innerjoin=True) |
| 272 | ) |
| 273 | |
| 274 | The above query, linking A.bs via "outer" join and B.cs via "inner" |
| 275 | join would render the joins as "a LEFT OUTER JOIN (b JOIN c)". When |
| 276 | using older versions of SQLite (< 3.7.16), this form of JOIN is |
| 277 | translated to use full subqueries as this syntax is otherwise not |
| 278 | directly supported. |
| 279 | |
| 280 | The ``innerjoin`` flag can also be stated with the term ``"unnested"``. |
| 281 | This indicates that an INNER JOIN should be used, *unless* the join |
| 282 | is linked to a LEFT OUTER JOIN to the left, in which case it |
| 283 | will render as LEFT OUTER JOIN. For example, supposing ``A.bs`` |
| 284 | is an outerjoin:: |
| 285 | |
| 286 | select(A).options(joinedload(A.bs).joinedload(B.cs, innerjoin="unnested")) |
| 287 | |
| 288 | The above join will render as "a LEFT OUTER JOIN b LEFT OUTER JOIN c", |
| 289 | rather than as "a LEFT OUTER JOIN (b JOIN c)". |
| 290 | |
| 291 | .. note:: The "unnested" flag does **not** affect the JOIN rendered |
| 292 | from a many-to-many association table, e.g. a table configured as |
| 293 | :paramref:`_orm.relationship.secondary`, to the target table; for |
| 294 | correctness of results, these joins are always INNER and are |
| 295 | therefore right-nested if linked to an OUTER join. |
| 296 |