1# orm/_orm_constructors.py
2# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors
3# <see AUTHORS file>
4#
5# This module is part of SQLAlchemy and is released under
6# the MIT License: https://www.opensource.org/licenses/mit-license.php
7
8from __future__ import annotations
9
10import typing
11from typing import Annotated
12from typing import Any
13from typing import Callable
14from typing import Collection
15from typing import Iterable
16from typing import Literal
17from typing import Mapping
18from typing import NoReturn
19from typing import Optional
20from typing import overload
21from typing import Type
22from typing import TYPE_CHECKING
23from typing import Union
24
25from . import mapperlib as mapperlib
26from ._typing import _O
27from .descriptor_props import Composite
28from .descriptor_props import Synonym
29from .interfaces import _AttributeOptions
30from .properties import MappedColumn
31from .properties import MappedSQLExpression
32from .query import AliasOption
33from .relationships import _RelationshipArgumentType
34from .relationships import _RelationshipBackPopulatesArgument
35from .relationships import _RelationshipDeclared
36from .relationships import _RelationshipSecondaryArgument
37from .relationships import RelationshipProperty
38from .session import Session
39from .util import _ORMJoin
40from .util import AliasedClass
41from .util import AliasedInsp
42from .util import LoaderCriteriaOption
43from .. import sql
44from .. import util
45from ..exc import InvalidRequestError
46from ..sql._typing import _no_kw
47from ..sql.base import _NoArg
48from ..sql.base import SchemaEventTarget
49from ..sql.schema import _InsertSentinelColumnDefault
50from ..sql.schema import SchemaConst
51from ..sql.selectable import FromClause
52
53if TYPE_CHECKING:
54 from ._typing import _EntityType
55 from ._typing import _ORMColumnExprArgument
56 from .descriptor_props import _CC
57 from .descriptor_props import _CompositeAttrType
58 from .interfaces import PropComparator
59 from .mapper import Mapper
60 from .query import Query
61 from .relationships import _LazyLoadArgumentType
62 from .relationships import _ORMColCollectionArgument
63 from .relationships import _ORMOrderByArgument
64 from .relationships import _RelationshipJoinConditionArgument
65 from .relationships import ORMBackrefArgument
66 from .session import _SessionBind
67 from ..sql._typing import _AutoIncrementType
68 from ..sql._typing import _ColumnExpressionArgument
69 from ..sql._typing import _FromClauseArgument
70 from ..sql._typing import _InfoType
71 from ..sql._typing import _OnClauseArgument
72 from ..sql._typing import _TypeEngineArgument
73 from ..sql.elements import ColumnElement
74 from ..sql.schema import _ServerDefaultArgument
75 from ..sql.schema import _ServerOnUpdateArgument
76 from ..sql.selectable import Alias
77 from ..sql.selectable import Subquery
78
79
80_T = typing.TypeVar("_T")
81
82
83@util.deprecated(
84 "1.4",
85 "The :class:`.AliasOption` object is not necessary "
86 "for entities to be matched up to a query that is established "
87 "via :meth:`.Query.from_statement` and now does nothing.",
88 enable_warnings=False, # AliasOption itself warns
89)
90def contains_alias(alias: Union[Alias, Subquery]) -> AliasOption:
91 r"""Return a :class:`.MapperOption` that will indicate to the
92 :class:`_query.Query`
93 that the main table has been aliased.
94
95 """
96 return AliasOption(alias)
97
98
99def mapped_column(
100 __name_pos: Optional[
101 Union[str, _TypeEngineArgument[Any], SchemaEventTarget]
102 ] = None,
103 __type_pos: Optional[
104 Union[_TypeEngineArgument[Any], SchemaEventTarget]
105 ] = None,
106 /,
107 *args: SchemaEventTarget,
108 init: Union[_NoArg, bool] = _NoArg.NO_ARG,
109 repr: Union[_NoArg, bool] = _NoArg.NO_ARG, # noqa: A002
110 default: Optional[Any] = _NoArg.NO_ARG,
111 default_factory: Union[_NoArg, Callable[[], _T]] = _NoArg.NO_ARG,
112 compare: Union[_NoArg, bool] = _NoArg.NO_ARG,
113 kw_only: Union[_NoArg, bool] = _NoArg.NO_ARG,
114 hash: Union[_NoArg, bool, None] = _NoArg.NO_ARG, # noqa: A002
115 nullable: Optional[
116 Union[bool, Literal[SchemaConst.NULL_UNSPECIFIED]]
117 ] = SchemaConst.NULL_UNSPECIFIED,
118 primary_key: Optional[bool] = False,
119 deferred: Union[_NoArg, bool] = _NoArg.NO_ARG,
120 deferred_group: Optional[str] = None,
121 deferred_raiseload: Optional[bool] = None,
122 use_existing_column: bool = False,
123 name: Optional[str] = None,
124 type_: Optional[_TypeEngineArgument[Any]] = None,
125 autoincrement: _AutoIncrementType = "auto",
126 doc: Optional[str] = None,
127 key: Optional[str] = None,
128 index: Optional[bool] = None,
129 unique: Optional[bool] = None,
130 info: Optional[_InfoType] = None,
131 onupdate: Optional[Any] = None,
132 insert_default: Optional[Any] = _NoArg.NO_ARG,
133 server_default: Optional[_ServerDefaultArgument] = None,
134 server_onupdate: Optional[_ServerOnUpdateArgument] = None,
135 active_history: bool = False,
136 quote: Optional[bool] = None,
137 system: bool = False,
138 comment: Optional[str] = None,
139 sort_order: Union[_NoArg, int] = _NoArg.NO_ARG,
140 dataclass_metadata: Union[_NoArg, Mapping[Any, Any], None] = _NoArg.NO_ARG,
141 **kw: Any,
142) -> MappedColumn[Any]:
143 r"""declare a new ORM-mapped :class:`_schema.Column` construct
144 for use within :ref:`Declarative Table <orm_declarative_table>`
145 configuration.
146
147 The :func:`_orm.mapped_column` function provides an ORM-aware and
148 Python-typing-compatible construct which is used with
149 :ref:`declarative <orm_declarative_mapping>` mappings to indicate an
150 attribute that's mapped to a Core :class:`_schema.Column` object. It
151 provides the equivalent feature as mapping an attribute to a
152 :class:`_schema.Column` object directly when using Declarative,
153 specifically when using :ref:`Declarative Table <orm_declarative_table>`
154 configuration.
155
156 .. versionadded:: 2.0
157
158 :func:`_orm.mapped_column` is normally used with explicit typing along with
159 the :class:`_orm.Mapped` annotation type, where it can derive the SQL
160 type and nullability for the column based on what's present within the
161 :class:`_orm.Mapped` annotation. It also may be used without annotations
162 as a drop-in replacement for how :class:`_schema.Column` is used in
163 Declarative mappings in SQLAlchemy 1.x style.
164
165 For usage examples of :func:`_orm.mapped_column`, see the documentation
166 at :ref:`orm_declarative_table`.
167
168 .. seealso::
169
170 :ref:`orm_declarative_table` - complete documentation
171
172 :ref:`whatsnew_20_orm_declarative_typing` - migration notes for
173 Declarative mappings using 1.x style mappings
174
175 :param __name: String name to give to the :class:`_schema.Column`. This
176 is an optional, positional only argument that if present must be the
177 first positional argument passed. If omitted, the attribute name to
178 which the :func:`_orm.mapped_column` is mapped will be used as the SQL
179 column name.
180 :param __type: :class:`_types.TypeEngine` type or instance which will
181 indicate the datatype to be associated with the :class:`_schema.Column`.
182 This is an optional, positional-only argument that if present must
183 immediately follow the ``__name`` parameter if present also, or otherwise
184 be the first positional parameter. If omitted, the ultimate type for
185 the column may be derived either from the annotated type, or if a
186 :class:`_schema.ForeignKey` is present, from the datatype of the
187 referenced column.
188 :param \*args: Additional positional arguments include constructs such
189 as :class:`_schema.ForeignKey`, :class:`_schema.CheckConstraint`,
190 and :class:`_schema.Identity`, which are passed through to the constructed
191 :class:`_schema.Column`.
192 :param nullable: Optional bool, whether the column should be "NULL" or
193 "NOT NULL". If omitted, the nullability is derived from the type
194 annotation based on whether or not ``typing.Optional`` (or its equivalent)
195 is present. ``nullable`` defaults to ``True`` otherwise for non-primary
196 key columns, and ``False`` for primary key columns.
197 :param primary_key: optional bool, indicates the :class:`_schema.Column`
198 would be part of the table's primary key or not.
199 :param deferred: Optional bool - this keyword argument is consumed by the
200 ORM declarative process, and is not part of the :class:`_schema.Column`
201 itself; instead, it indicates that this column should be "deferred" for
202 loading as though mapped by :func:`_orm.deferred`.
203
204 .. seealso::
205
206 :ref:`orm_queryguide_deferred_declarative`
207
208 :param deferred_group: Implies :paramref:`_orm.mapped_column.deferred`
209 to ``True``, and set the :paramref:`_orm.deferred.group` parameter.
210
211 .. seealso::
212
213 :ref:`orm_queryguide_deferred_group`
214
215 :param deferred_raiseload: Implies :paramref:`_orm.mapped_column.deferred`
216 to ``True``, and set the :paramref:`_orm.deferred.raiseload` parameter.
217
218 .. seealso::
219
220 :ref:`orm_queryguide_deferred_raiseload`
221
222 :param use_existing_column: if True, will attempt to locate the given
223 column name on an inherited superclass (typically single inheriting
224 superclass), and if present, will not produce a new column, mapping
225 to the superclass column as though it were omitted from this class.
226 This is used for mixins that add new columns to an inherited superclass.
227
228 .. seealso::
229
230 :ref:`orm_inheritance_column_conflicts`
231
232 .. versionadded:: 2.0.0b4
233
234 :param default: Passed directly to the
235 :paramref:`_schema.Column.default` parameter if the
236 :paramref:`_orm.mapped_column.insert_default` parameter is not present.
237 Additionally, when used with :ref:`orm_declarative_native_dataclasses`,
238 indicates a default Python value that should be applied to the keyword
239 constructor within the generated ``__init__()`` method.
240
241 Note that in the case of dataclass generation when
242 :paramref:`_orm.mapped_column.insert_default` is not present, this means
243 the :paramref:`_orm.mapped_column.default` value is used in **two**
244 places, both the ``__init__()`` method as well as the
245 :paramref:`_schema.Column.default` parameter. While this behavior may
246 change in a future release, for the moment this tends to "work out"; a
247 default of ``None`` will mean that the :class:`_schema.Column` gets no
248 default generator, whereas a default that refers to a non-``None`` Python
249 or SQL expression value will be assigned up front on the object when
250 ``__init__()`` is called, which is the same value that the Core
251 :class:`_sql.Insert` construct would use in any case, leading to the same
252 end result.
253
254 .. note:: When using Core level column defaults that are callables to
255 be interpreted by the underlying :class:`_schema.Column` in conjunction
256 with :ref:`ORM-mapped dataclasses
257 <orm_declarative_native_dataclasses>`, especially those that are
258 :ref:`context-aware default functions <context_default_functions>`,
259 **the** :paramref:`_orm.mapped_column.insert_default` **parameter must
260 be used instead**. This is necessary to disambiguate the callable from
261 being interpreted as a dataclass level default.
262
263 .. seealso::
264
265 :ref:`defaults_default_factory_insert_default`
266
267 :paramref:`_orm.mapped_column.insert_default`
268
269 :paramref:`_orm.mapped_column.default_factory`
270
271 :param insert_default: Passed directly to the
272 :paramref:`_schema.Column.default` parameter; will supersede the value
273 of :paramref:`_orm.mapped_column.default` when present, however
274 :paramref:`_orm.mapped_column.default` will always apply to the
275 constructor default for a dataclasses mapping.
276
277 .. seealso::
278
279 :ref:`defaults_default_factory_insert_default`
280
281 :paramref:`_orm.mapped_column.default`
282
283 :paramref:`_orm.mapped_column.default_factory`
284
285 :param sort_order: An integer that indicates how this mapped column
286 should be sorted compared to the others when the ORM is creating a
287 :class:`_schema.Table`. Among mapped columns that have the same
288 value the default ordering is used, placing first the mapped columns
289 defined in the main class, then the ones in the super classes.
290 Defaults to 0. The sort is ascending.
291
292 .. versionadded:: 2.0.4
293
294 :param active_history=False:
295
296 When ``True``, indicates that the "previous" value for a
297 scalar attribute should be loaded when replaced, if not
298 already loaded. Normally, history tracking logic for
299 simple non-primary-key scalar values only needs to be
300 aware of the "new" value in order to perform a flush. This
301 flag is available for applications that make use of
302 :func:`.attributes.get_history` or :meth:`.Session.is_modified`
303 which also need to know the "previous" value of the attribute.
304
305 .. versionadded:: 2.0.10
306
307
308 :param init: Specific to :ref:`orm_declarative_native_dataclasses`,
309 specifies if the mapped attribute should be part of the ``__init__()``
310 method as generated by the dataclass process.
311 :param repr: Specific to :ref:`orm_declarative_native_dataclasses`,
312 specifies if the mapped attribute should be part of the ``__repr__()``
313 method as generated by the dataclass process.
314 :param default_factory: Specific to
315 :ref:`orm_declarative_native_dataclasses`,
316 specifies a default-value generation function that will take place
317 as part of the ``__init__()``
318 method as generated by the dataclass process.
319
320 .. seealso::
321
322 :ref:`defaults_default_factory_insert_default`
323
324 :paramref:`_orm.mapped_column.default`
325
326 :paramref:`_orm.mapped_column.insert_default`
327
328 :param compare: Specific to
329 :ref:`orm_declarative_native_dataclasses`, indicates if this field
330 should be included in comparison operations when generating the
331 ``__eq__()`` and ``__ne__()`` methods for the mapped class.
332
333 .. versionadded:: 2.0.0b4
334
335 :param kw_only: Specific to
336 :ref:`orm_declarative_native_dataclasses`, indicates if this field
337 should be marked as keyword-only when generating the ``__init__()``.
338
339 :param hash: Specific to
340 :ref:`orm_declarative_native_dataclasses`, controls if this field
341 is included when generating the ``__hash__()`` method for the mapped
342 class.
343
344 .. versionadded:: 2.0.36
345
346 :param dataclass_metadata: Specific to
347 :ref:`orm_declarative_native_dataclasses`, supplies metadata
348 to be attached to the generated dataclass field.
349
350 .. versionadded:: 2.0.42
351
352 :param \**kw: All remaining keyword arguments are passed through to the
353 constructor for the :class:`_schema.Column`.
354
355 """
356
357 return MappedColumn(
358 __name_pos,
359 __type_pos,
360 *args,
361 name=name,
362 type_=type_,
363 autoincrement=autoincrement,
364 insert_default=insert_default,
365 attribute_options=_AttributeOptions(
366 init,
367 repr,
368 default,
369 default_factory,
370 compare,
371 kw_only,
372 hash,
373 dataclass_metadata,
374 ),
375 doc=doc,
376 key=key,
377 index=index,
378 unique=unique,
379 info=info,
380 active_history=active_history,
381 nullable=nullable,
382 onupdate=onupdate,
383 primary_key=primary_key,
384 server_default=server_default,
385 server_onupdate=server_onupdate,
386 use_existing_column=use_existing_column,
387 quote=quote,
388 comment=comment,
389 system=system,
390 deferred=deferred,
391 deferred_group=deferred_group,
392 deferred_raiseload=deferred_raiseload,
393 sort_order=sort_order,
394 **kw,
395 )
396
397
398def orm_insert_sentinel(
399 name: Optional[str] = None,
400 type_: Optional[_TypeEngineArgument[Any]] = None,
401 *,
402 default: Optional[Any] = None,
403 omit_from_statements: bool = True,
404) -> MappedColumn[Any]:
405 """Provides a surrogate :func:`_orm.mapped_column` that generates
406 a so-called :term:`sentinel` column, allowing efficient bulk
407 inserts with deterministic RETURNING sorting for tables that don't
408 otherwise have qualifying primary key configurations.
409
410 Use of :func:`_orm.orm_insert_sentinel` is analogous to the use of the
411 :func:`_schema.insert_sentinel` construct within a Core
412 :class:`_schema.Table` construct.
413
414 Guidelines for adding this construct to a Declarative mapped class
415 are the same as that of the :func:`_schema.insert_sentinel` construct;
416 the database table itself also needs to have a column with this name
417 present.
418
419 For background on how this object is used, see the section
420 :ref:`engine_insertmanyvalues_sentinel_columns` as part of the
421 section :ref:`engine_insertmanyvalues`.
422
423 .. seealso::
424
425 :func:`_schema.insert_sentinel`
426
427 :ref:`engine_insertmanyvalues`
428
429 :ref:`engine_insertmanyvalues_sentinel_columns`
430
431
432 .. versionadded:: 2.0.10
433
434 """
435
436 return mapped_column(
437 name=name,
438 default=(
439 default if default is not None else _InsertSentinelColumnDefault()
440 ),
441 _omit_from_statements=omit_from_statements,
442 insert_sentinel=True,
443 use_existing_column=True,
444 nullable=True,
445 )
446
447
448@util.deprecated_params(
449 **{
450 arg: (
451 "2.0",
452 f"The :paramref:`_orm.column_property.{arg}` parameter is "
453 "deprecated for :func:`_orm.column_property`. This parameter "
454 "applies to a writeable-attribute in a Declarative Dataclasses "
455 "configuration only, and :func:`_orm.column_property` is treated "
456 "as a read-only attribute in this context.",
457 )
458 for arg in ("init", "kw_only", "default", "default_factory")
459 }
460)
461def column_property(
462 column: _ORMColumnExprArgument[_T],
463 *additional_columns: _ORMColumnExprArgument[Any],
464 group: Optional[str] = None,
465 deferred: bool = False,
466 raiseload: bool = False,
467 comparator_factory: Optional[Type[PropComparator[_T]]] = None,
468 init: Union[_NoArg, bool] = _NoArg.NO_ARG,
469 repr: Union[_NoArg, bool] = _NoArg.NO_ARG, # noqa: A002
470 default: Optional[Any] = _NoArg.NO_ARG,
471 default_factory: Union[_NoArg, Callable[[], _T]] = _NoArg.NO_ARG,
472 compare: Union[_NoArg, bool] = _NoArg.NO_ARG,
473 kw_only: Union[_NoArg, bool] = _NoArg.NO_ARG,
474 hash: Union[_NoArg, bool, None] = _NoArg.NO_ARG, # noqa: A002
475 active_history: bool = False,
476 expire_on_flush: bool = True,
477 info: Optional[_InfoType] = None,
478 doc: Optional[str] = None,
479 dataclass_metadata: Union[_NoArg, Mapping[Any, Any], None] = _NoArg.NO_ARG,
480) -> MappedSQLExpression[_T]:
481 r"""Provide a column-level property for use with a mapping.
482
483 With Declarative mappings, :func:`_orm.column_property` is used to
484 map read-only SQL expressions to a mapped class.
485
486 When using Imperative mappings, :func:`_orm.column_property` also
487 takes on the role of mapping table columns with additional features.
488 When using fully Declarative mappings, the :func:`_orm.mapped_column`
489 construct should be used for this purpose.
490
491 With Declarative Dataclass mappings, :func:`_orm.column_property`
492 is considered to be **read only**, and will not be included in the
493 Dataclass ``__init__()`` constructor.
494
495 The :func:`_orm.column_property` function returns an instance of
496 :class:`.ColumnProperty`.
497
498 .. seealso::
499
500 :ref:`mapper_column_property_sql_expressions` - general use of
501 :func:`_orm.column_property` to map SQL expressions
502
503 :ref:`orm_imperative_table_column_options` - usage of
504 :func:`_orm.column_property` with Imperative Table mappings to apply
505 additional options to a plain :class:`_schema.Column` object
506
507 :param \*cols:
508 list of Column objects to be mapped.
509
510 :param active_history=False:
511
512 Used only for Imperative Table mappings, or legacy-style Declarative
513 mappings (i.e. which have not been upgraded to
514 :func:`_orm.mapped_column`), for column-based attributes that are
515 expected to be writeable; use :func:`_orm.mapped_column` with
516 :paramref:`_orm.mapped_column.active_history` for Declarative mappings.
517 See that parameter for functional details.
518
519 :param comparator_factory: a class which extends
520 :class:`.ColumnProperty.Comparator` which provides custom SQL
521 clause generation for comparison operations.
522
523 :param group:
524 a group name for this property when marked as deferred.
525
526 :param deferred:
527 when True, the column property is "deferred", meaning that
528 it does not load immediately, and is instead loaded when the
529 attribute is first accessed on an instance. See also
530 :func:`~sqlalchemy.orm.deferred`.
531
532 :param doc:
533 optional string that will be applied as the doc on the
534 class-bound descriptor.
535
536 :param expire_on_flush=True:
537 Disable expiry on flush. A column_property() which refers
538 to a SQL expression (and not a single table-bound column)
539 is considered to be a "read only" property; populating it
540 has no effect on the state of data, and it can only return
541 database state. For this reason a column_property()'s value
542 is expired whenever the parent object is involved in a
543 flush, that is, has any kind of "dirty" state within a flush.
544 Setting this parameter to ``False`` will have the effect of
545 leaving any existing value present after the flush proceeds.
546 Note that the :class:`.Session` with default expiration
547 settings still expires
548 all attributes after a :meth:`.Session.commit` call, however.
549
550 :param info: Optional data dictionary which will be populated into the
551 :attr:`.MapperProperty.info` attribute of this object.
552
553 :param raiseload: if True, indicates the column should raise an error
554 when undeferred, rather than loading the value. This can be
555 altered at query time by using the :func:`.deferred` option with
556 raiseload=False.
557
558 .. versionadded:: 1.4
559
560 .. seealso::
561
562 :ref:`orm_queryguide_deferred_raiseload`
563
564 :param init: Specific to :ref:`orm_declarative_native_dataclasses`,
565 specifies if the mapped attribute should be part of the ``__init__()``
566 method as generated by the dataclass process.
567 :param repr: Specific to :ref:`orm_declarative_native_dataclasses`,
568 specifies if the mapped attribute should be part of the ``__repr__()``
569 method as generated by the dataclass process.
570 :param default_factory: Specific to
571 :ref:`orm_declarative_native_dataclasses`,
572 specifies a default-value generation function that will take place
573 as part of the ``__init__()``
574 method as generated by the dataclass process.
575
576 .. seealso::
577
578 :ref:`defaults_default_factory_insert_default`
579
580 :paramref:`_orm.mapped_column.default`
581
582 :paramref:`_orm.mapped_column.insert_default`
583
584 :param compare: Specific to
585 :ref:`orm_declarative_native_dataclasses`, indicates if this field
586 should be included in comparison operations when generating the
587 ``__eq__()`` and ``__ne__()`` methods for the mapped class.
588
589 .. versionadded:: 2.0.0b4
590
591 :param kw_only: Specific to
592 :ref:`orm_declarative_native_dataclasses`, indicates if this field
593 should be marked as keyword-only when generating the ``__init__()``.
594
595 :param hash: Specific to
596 :ref:`orm_declarative_native_dataclasses`, controls if this field
597 is included when generating the ``__hash__()`` method for the mapped
598 class.
599
600 .. versionadded:: 2.0.36
601
602 :param dataclass_metadata: Specific to
603 :ref:`orm_declarative_native_dataclasses`, supplies metadata
604 to be attached to the generated dataclass field.
605
606 .. versionadded:: 2.0.42
607
608 """
609 return MappedSQLExpression(
610 column,
611 *additional_columns,
612 attribute_options=_AttributeOptions(
613 False if init is _NoArg.NO_ARG else init,
614 repr,
615 default,
616 default_factory,
617 compare,
618 kw_only,
619 hash,
620 dataclass_metadata,
621 ),
622 group=group,
623 deferred=deferred,
624 raiseload=raiseload,
625 comparator_factory=comparator_factory,
626 active_history=active_history,
627 expire_on_flush=expire_on_flush,
628 info=info,
629 doc=doc,
630 _assume_readonly_dc_attributes=True,
631 )
632
633
634@overload
635def composite(
636 _class_or_attr: _CompositeAttrType[Any],
637 /,
638 *attrs: _CompositeAttrType[Any],
639 group: Optional[str] = None,
640 deferred: bool = False,
641 raiseload: bool = False,
642 return_none_on: Union[_NoArg, None, Callable[..., bool]] = _NoArg.NO_ARG,
643 comparator_factory: Optional[Type[Composite.Comparator[_T]]] = None,
644 active_history: bool = False,
645 init: Union[_NoArg, bool] = _NoArg.NO_ARG,
646 repr: Union[_NoArg, bool] = _NoArg.NO_ARG, # noqa: A002
647 default: Optional[Any] = _NoArg.NO_ARG,
648 default_factory: Union[_NoArg, Callable[[], _T]] = _NoArg.NO_ARG,
649 compare: Union[_NoArg, bool] = _NoArg.NO_ARG,
650 kw_only: Union[_NoArg, bool] = _NoArg.NO_ARG,
651 hash: Union[_NoArg, bool, None] = _NoArg.NO_ARG, # noqa: A002
652 info: Optional[_InfoType] = None,
653 doc: Optional[str] = None,
654 dataclass_metadata: Union[_NoArg, Mapping[Any, Any], None] = _NoArg.NO_ARG,
655 **__kw: Any,
656) -> Composite[Any]: ...
657
658
659@overload
660def composite(
661 _class_or_attr: Type[_CC],
662 /,
663 *attrs: _CompositeAttrType[Any],
664 group: Optional[str] = None,
665 deferred: bool = False,
666 raiseload: bool = False,
667 return_none_on: Union[_NoArg, None, Callable[..., bool]] = _NoArg.NO_ARG,
668 comparator_factory: Optional[Type[Composite.Comparator[_T]]] = None,
669 active_history: bool = False,
670 init: Union[_NoArg, bool] = _NoArg.NO_ARG,
671 repr: Union[_NoArg, bool] = _NoArg.NO_ARG, # noqa: A002
672 default: Optional[Any] = _NoArg.NO_ARG,
673 default_factory: Union[_NoArg, Callable[[], _T]] = _NoArg.NO_ARG,
674 compare: Union[_NoArg, bool] = _NoArg.NO_ARG,
675 kw_only: Union[_NoArg, bool] = _NoArg.NO_ARG,
676 hash: Union[_NoArg, bool, None] = _NoArg.NO_ARG, # noqa: A002
677 info: Optional[_InfoType] = None,
678 doc: Optional[str] = None,
679 **__kw: Any,
680) -> Composite[_CC]: ...
681
682
683@overload
684def composite(
685 _class_or_attr: Callable[..., _CC],
686 /,
687 *attrs: _CompositeAttrType[Any],
688 group: Optional[str] = None,
689 deferred: bool = False,
690 raiseload: bool = False,
691 return_none_on: Union[_NoArg, None, Callable[..., bool]] = _NoArg.NO_ARG,
692 comparator_factory: Optional[Type[Composite.Comparator[_T]]] = None,
693 active_history: bool = False,
694 init: Union[_NoArg, bool] = _NoArg.NO_ARG,
695 repr: Union[_NoArg, bool] = _NoArg.NO_ARG, # noqa: A002
696 default: Optional[Any] = _NoArg.NO_ARG,
697 default_factory: Union[_NoArg, Callable[[], _T]] = _NoArg.NO_ARG,
698 compare: Union[_NoArg, bool] = _NoArg.NO_ARG,
699 kw_only: Union[_NoArg, bool] = _NoArg.NO_ARG,
700 hash: Union[_NoArg, bool, None] = _NoArg.NO_ARG, # noqa: A002
701 info: Optional[_InfoType] = None,
702 doc: Optional[str] = None,
703 **__kw: Any,
704) -> Composite[_CC]: ...
705
706
707def composite(
708 _class_or_attr: Union[
709 None, Type[_CC], Callable[..., _CC], _CompositeAttrType[Any]
710 ] = None,
711 /,
712 *attrs: _CompositeAttrType[Any],
713 group: Optional[str] = None,
714 deferred: bool = False,
715 raiseload: bool = False,
716 return_none_on: Union[_NoArg, None, Callable[..., bool]] = _NoArg.NO_ARG,
717 comparator_factory: Optional[Type[Composite.Comparator[_T]]] = None,
718 active_history: bool = False,
719 init: Union[_NoArg, bool] = _NoArg.NO_ARG,
720 repr: Union[_NoArg, bool] = _NoArg.NO_ARG, # noqa: A002
721 default: Optional[Any] = _NoArg.NO_ARG,
722 default_factory: Union[_NoArg, Callable[[], _T]] = _NoArg.NO_ARG,
723 compare: Union[_NoArg, bool] = _NoArg.NO_ARG,
724 kw_only: Union[_NoArg, bool] = _NoArg.NO_ARG,
725 hash: Union[_NoArg, bool, None] = _NoArg.NO_ARG, # noqa: A002
726 info: Optional[_InfoType] = None,
727 doc: Optional[str] = None,
728 dataclass_metadata: Union[_NoArg, Mapping[Any, Any], None] = _NoArg.NO_ARG,
729 **__kw: Any,
730) -> Composite[Any]:
731 r"""Return a composite column-based property for use with a Mapper.
732
733 See the mapping documentation section :ref:`mapper_composite` for a
734 full usage example.
735
736 The :class:`.MapperProperty` returned by :func:`.composite`
737 is the :class:`.Composite`.
738
739 :param class\_:
740 The "composite type" class, or any classmethod or callable which
741 will produce a new instance of the composite object given the
742 column values in order.
743
744 :param \*attrs:
745 List of elements to be mapped, which may include:
746
747 * :class:`_schema.Column` objects
748 * :func:`_orm.mapped_column` constructs
749 * string names of other attributes on the mapped class, which may be
750 any other SQL or object-mapped attribute. This can for
751 example allow a composite that refers to a many-to-one relationship
752
753 :param active_history=False:
754 When ``True``, indicates that the "previous" value for a
755 scalar attribute should be loaded when replaced, if not
756 already loaded. See the same flag on :func:`.column_property`.
757
758 :param return_none_on=None: A callable that will be evaluated when the
759 composite object is to be constructed, which upon returning the boolean
760 value ``True`` will instead bypass the construction and cause the
761 resulting value to be None. This typically may be assigned a lambda
762 that will evaluate to True when all the columns within the composite
763 are themselves None, e.g.::
764
765 composite(
766 MyComposite, return_none_on=lambda *cols: all(x is None for x in cols)
767 )
768
769 The above lambda for :paramref:`.composite.return_none_on` is used
770 automatically when using ORM Annotated Declarative along with an optional
771 value within the :class:`.Mapped` annotation.
772
773 .. versionadded:: 2.1
774
775 :param group:
776 A group name for this property when marked as deferred.
777
778 :param deferred:
779 When True, the column property is "deferred", meaning that it does
780 not load immediately, and is instead loaded when the attribute is
781 first accessed on an instance. See also
782 :func:`~sqlalchemy.orm.deferred`.
783
784 :param comparator_factory: a class which extends
785 :class:`.Composite.Comparator` which provides custom SQL
786 clause generation for comparison operations.
787
788 :param doc:
789 optional string that will be applied as the doc on the
790 class-bound descriptor.
791
792 :param info: Optional data dictionary which will be populated into the
793 :attr:`.MapperProperty.info` attribute of this object.
794
795 :param init: Specific to :ref:`orm_declarative_native_dataclasses`,
796 specifies if the mapped attribute should be part of the ``__init__()``
797 method as generated by the dataclass process.
798 :param repr: Specific to :ref:`orm_declarative_native_dataclasses`,
799 specifies if the mapped attribute should be part of the ``__repr__()``
800 method as generated by the dataclass process.
801 :param default_factory: Specific to
802 :ref:`orm_declarative_native_dataclasses`,
803 specifies a default-value generation function that will take place
804 as part of the ``__init__()``
805 method as generated by the dataclass process.
806
807 :param compare: Specific to
808 :ref:`orm_declarative_native_dataclasses`, indicates if this field
809 should be included in comparison operations when generating the
810 ``__eq__()`` and ``__ne__()`` methods for the mapped class.
811
812 .. versionadded:: 2.0.0b4
813
814 :param kw_only: Specific to
815 :ref:`orm_declarative_native_dataclasses`, indicates if this field
816 should be marked as keyword-only when generating the ``__init__()``.
817
818 :param hash: Specific to
819 :ref:`orm_declarative_native_dataclasses`, controls if this field
820 is included when generating the ``__hash__()`` method for the mapped
821 class.
822
823 .. versionadded:: 2.0.36
824
825 :param dataclass_metadata: Specific to
826 :ref:`orm_declarative_native_dataclasses`, supplies metadata
827 to be attached to the generated dataclass field.
828
829 .. versionadded:: 2.0.42
830
831 """ # noqa: E501
832
833 if __kw:
834 raise _no_kw()
835
836 return Composite(
837 _class_or_attr,
838 *attrs,
839 return_none_on=return_none_on,
840 attribute_options=_AttributeOptions(
841 init,
842 repr,
843 default,
844 default_factory,
845 compare,
846 kw_only,
847 hash,
848 dataclass_metadata,
849 ),
850 group=group,
851 deferred=deferred,
852 raiseload=raiseload,
853 comparator_factory=comparator_factory,
854 active_history=active_history,
855 info=info,
856 doc=doc,
857 )
858
859
860def with_loader_criteria(
861 entity_or_base: _EntityType[Any],
862 where_criteria: Union[
863 _ColumnExpressionArgument[bool],
864 Callable[[Any], _ColumnExpressionArgument[bool]],
865 ],
866 loader_only: bool = False,
867 include_aliases: bool = False,
868 propagate_to_loaders: bool = True,
869 track_closure_variables: bool = True,
870) -> LoaderCriteriaOption:
871 """Add additional WHERE criteria to the load for all occurrences of
872 a particular entity.
873
874 .. versionadded:: 1.4
875
876 The :func:`_orm.with_loader_criteria` option is intended to add
877 limiting criteria to a particular kind of entity in a query,
878 **globally**, meaning it will apply to the entity as it appears
879 in the SELECT query as well as within any subqueries, join
880 conditions, and relationship loads, including both eager and lazy
881 loaders, without the need for it to be specified in any particular
882 part of the query. The rendering logic uses the same system used by
883 single table inheritance to ensure a certain discriminator is applied
884 to a table.
885
886 E.g., using :term:`2.0-style` queries, we can limit the way the
887 ``User.addresses`` collection is loaded, regardless of the kind
888 of loading used::
889
890 from sqlalchemy.orm import with_loader_criteria
891
892 stmt = select(User).options(
893 selectinload(User.addresses),
894 with_loader_criteria(Address, Address.email_address != "foo"),
895 )
896
897 Above, the "selectinload" for ``User.addresses`` will apply the
898 given filtering criteria to the WHERE clause.
899
900 Another example, where the filtering will be applied to the
901 ON clause of the join, in this example using :term:`1.x style`
902 queries::
903
904 q = (
905 session.query(User)
906 .outerjoin(User.addresses)
907 .options(with_loader_criteria(Address, Address.email_address != "foo"))
908 )
909
910 The primary purpose of :func:`_orm.with_loader_criteria` is to use
911 it in the :meth:`_orm.SessionEvents.do_orm_execute` event handler
912 to ensure that all occurrences of a particular entity are filtered
913 in a certain way, such as filtering for access control roles. It
914 also can be used to apply criteria to relationship loads. In the
915 example below, we can apply a certain set of rules to all queries
916 emitted by a particular :class:`_orm.Session`::
917
918 session = Session(bind=engine)
919
920
921 @event.listens_for("do_orm_execute", session)
922 def _add_filtering_criteria(execute_state):
923
924 if (
925 execute_state.is_select
926 and not execute_state.is_column_load
927 and not execute_state.is_relationship_load
928 ):
929 execute_state.statement = execute_state.statement.options(
930 with_loader_criteria(
931 SecurityRole,
932 lambda cls: cls.role.in_(["some_role"]),
933 include_aliases=True,
934 )
935 )
936
937 In the above example, the :meth:`_orm.SessionEvents.do_orm_execute`
938 event will intercept all queries emitted using the
939 :class:`_orm.Session`. For those queries which are SELECT statements
940 and are not attribute or relationship loads a custom
941 :func:`_orm.with_loader_criteria` option is added to the query. The
942 :func:`_orm.with_loader_criteria` option will be used in the given
943 statement and will also be automatically propagated to all relationship
944 loads that descend from this query.
945
946 The criteria argument given is a ``lambda`` that accepts a ``cls``
947 argument. The given class will expand to include all mapped subclass
948 and need not itself be a mapped class.
949
950 .. tip::
951
952 When using :func:`_orm.with_loader_criteria` option in
953 conjunction with the :func:`_orm.contains_eager` loader option,
954 it's important to note that :func:`_orm.with_loader_criteria` only
955 affects the part of the query that determines what SQL is rendered
956 in terms of the WHERE and FROM clauses. The
957 :func:`_orm.contains_eager` option does not affect the rendering of
958 the SELECT statement outside of the columns clause, so does not have
959 any interaction with the :func:`_orm.with_loader_criteria` option.
960 However, the way things "work" is that :func:`_orm.contains_eager`
961 is meant to be used with a query that is already selecting from the
962 additional entities in some way, where
963 :func:`_orm.with_loader_criteria` can apply it's additional
964 criteria.
965
966 In the example below, assuming a mapping relationship as
967 ``A -> A.bs -> B``, the given :func:`_orm.with_loader_criteria`
968 option will affect the way in which the JOIN is rendered::
969
970 stmt = (
971 select(A)
972 .join(A.bs)
973 .options(contains_eager(A.bs), with_loader_criteria(B, B.flag == 1))
974 )
975
976 Above, the given :func:`_orm.with_loader_criteria` option will
977 affect the ON clause of the JOIN that is specified by
978 ``.join(A.bs)``, so is applied as expected. The
979 :func:`_orm.contains_eager` option has the effect that columns from
980 ``B`` are added to the columns clause:
981
982 .. sourcecode:: sql
983
984 SELECT
985 b.id, b.a_id, b.data, b.flag,
986 a.id AS id_1,
987 a.data AS data_1
988 FROM a JOIN b ON a.id = b.a_id AND b.flag = :flag_1
989
990
991 The use of the :func:`_orm.contains_eager` option within the above
992 statement has no effect on the behavior of the
993 :func:`_orm.with_loader_criteria` option. If the
994 :func:`_orm.contains_eager` option were omitted, the SQL would be
995 the same as regards the FROM and WHERE clauses, where
996 :func:`_orm.with_loader_criteria` continues to add its criteria to
997 the ON clause of the JOIN. The addition of
998 :func:`_orm.contains_eager` only affects the columns clause, in that
999 additional columns against ``b`` are added which are then consumed
1000 by the ORM to produce ``B`` instances.
1001
1002 .. warning:: The use of a lambda inside of the call to
1003 :func:`_orm.with_loader_criteria` is only invoked **once per unique
1004 class**. Custom functions should not be invoked within this lambda.
1005 See :ref:`engine_lambda_caching` for an overview of the "lambda SQL"
1006 feature, which is for advanced use only.
1007
1008 :param entity_or_base: a mapped class, or a class that is a super
1009 class of a particular set of mapped classes, to which the rule
1010 will apply.
1011
1012 :param where_criteria: a Core SQL expression that applies limiting
1013 criteria. This may also be a "lambda:" or Python function that
1014 accepts a target class as an argument, when the given class is
1015 a base with many different mapped subclasses.
1016
1017 .. note:: To support pickling, use a module-level Python function to
1018 produce the SQL expression instead of a lambda or a fixed SQL
1019 expression, which tend to not be picklable.
1020
1021 :param include_aliases: if True, apply the rule to :func:`_orm.aliased`
1022 constructs as well.
1023
1024 :param propagate_to_loaders: defaults to True, apply to relationship
1025 loaders such as lazy loaders. This indicates that the
1026 option object itself including SQL expression is carried along with
1027 each loaded instance. Set to ``False`` to prevent the object from
1028 being assigned to individual instances.
1029
1030
1031 .. seealso::
1032
1033 :ref:`examples_session_orm_events` - includes examples of using
1034 :func:`_orm.with_loader_criteria`.
1035
1036 :ref:`do_orm_execute_global_criteria` - basic example on how to
1037 combine :func:`_orm.with_loader_criteria` with the
1038 :meth:`_orm.SessionEvents.do_orm_execute` event.
1039
1040 :param track_closure_variables: when False, closure variables inside
1041 of a lambda expression will not be used as part of
1042 any cache key. This allows more complex expressions to be used
1043 inside of a lambda expression but requires that the lambda ensures
1044 it returns the identical SQL every time given a particular class.
1045
1046 .. versionadded:: 1.4.0b2
1047
1048 """ # noqa: E501
1049 return LoaderCriteriaOption(
1050 entity_or_base,
1051 where_criteria,
1052 loader_only,
1053 include_aliases,
1054 propagate_to_loaders,
1055 track_closure_variables,
1056 )
1057
1058
1059def relationship(
1060 argument: Optional[_RelationshipArgumentType[Any]] = None,
1061 secondary: Optional[_RelationshipSecondaryArgument] = None,
1062 *,
1063 uselist: Optional[bool] = None,
1064 collection_class: Optional[
1065 Union[Type[Collection[Any]], Callable[[], Collection[Any]]]
1066 ] = None,
1067 primaryjoin: Optional[_RelationshipJoinConditionArgument] = None,
1068 secondaryjoin: Optional[_RelationshipJoinConditionArgument] = None,
1069 back_populates: Optional[_RelationshipBackPopulatesArgument] = None,
1070 order_by: _ORMOrderByArgument = False,
1071 backref: Optional[ORMBackrefArgument] = None,
1072 overlaps: Optional[str] = None,
1073 post_update: bool = False,
1074 cascade: str = "save-update, merge",
1075 viewonly: bool = False,
1076 init: Union[_NoArg, bool] = _NoArg.NO_ARG,
1077 repr: Union[_NoArg, bool] = _NoArg.NO_ARG, # noqa: A002
1078 default: Union[_NoArg, _T] = _NoArg.NO_ARG,
1079 default_factory: Union[_NoArg, Callable[[], _T]] = _NoArg.NO_ARG,
1080 compare: Union[_NoArg, bool] = _NoArg.NO_ARG,
1081 kw_only: Union[_NoArg, bool] = _NoArg.NO_ARG,
1082 hash: Union[_NoArg, bool, None] = _NoArg.NO_ARG, # noqa: A002
1083 lazy: _LazyLoadArgumentType = "select",
1084 passive_deletes: Union[Literal["all"], bool] = False,
1085 passive_updates: bool = True,
1086 active_history: bool = False,
1087 enable_typechecks: bool = True,
1088 foreign_keys: Optional[_ORMColCollectionArgument] = None,
1089 remote_side: Optional[_ORMColCollectionArgument] = None,
1090 join_depth: Optional[int] = None,
1091 comparator_factory: Optional[
1092 Type[RelationshipProperty.Comparator[Any]]
1093 ] = None,
1094 single_parent: bool = False,
1095 innerjoin: bool = False,
1096 distinct_target_key: Optional[bool] = None,
1097 load_on_pending: bool = False,
1098 query_class: Optional[Type[Query[Any]]] = None,
1099 info: Optional[_InfoType] = None,
1100 omit_join: Literal[None, False] = None,
1101 sync_backref: Optional[bool] = None,
1102 dataclass_metadata: Union[_NoArg, Mapping[Any, Any], None] = _NoArg.NO_ARG,
1103 **kw: Any,
1104) -> _RelationshipDeclared[Any]:
1105 """Provide a relationship between two mapped classes.
1106
1107 This corresponds to a parent-child or associative table relationship.
1108 The constructed class is an instance of :class:`.Relationship`.
1109
1110 .. seealso::
1111
1112 :ref:`tutorial_orm_related_objects` - tutorial introduction
1113 to :func:`_orm.relationship` in the :ref:`unified_tutorial`
1114
1115 :ref:`relationship_config_toplevel` - narrative documentation
1116
1117 :param argument:
1118 This parameter refers to the class that is to be related. It
1119 accepts several forms, including a direct reference to the target
1120 class itself, the :class:`_orm.Mapper` instance for the target class,
1121 a Python callable / lambda that will return a reference to the
1122 class or :class:`_orm.Mapper` when called, and finally a string
1123 name for the class, which will be resolved from the
1124 :class:`_orm.registry` in use in order to locate the class, e.g.::
1125
1126 class SomeClass(Base):
1127 # ...
1128
1129 related = relationship("RelatedClass")
1130
1131 The :paramref:`_orm.relationship.argument` may also be omitted from the
1132 :func:`_orm.relationship` construct entirely, and instead placed inside
1133 a :class:`_orm.Mapped` annotation on the left side, which should
1134 include a Python collection type if the relationship is expected
1135 to be a collection, such as::
1136
1137 class SomeClass(Base):
1138 # ...
1139
1140 related_items: Mapped[List["RelatedItem"]] = relationship()
1141
1142 Or for a many-to-one or one-to-one relationship::
1143
1144 class SomeClass(Base):
1145 # ...
1146
1147 related_item: Mapped["RelatedItem"] = relationship()
1148
1149 .. seealso::
1150
1151 :ref:`orm_declarative_properties` - further detail
1152 on relationship configuration when using Declarative.
1153
1154 :param secondary:
1155 For a many-to-many relationship, specifies the intermediary
1156 table, and is typically an instance of :class:`_schema.Table`.
1157 In less common circumstances, the argument may also be specified
1158 as an :class:`_expression.Alias` construct, or even a
1159 :class:`_expression.Join` construct.
1160
1161 :paramref:`_orm.relationship.secondary` may
1162 also be passed as a callable function which is evaluated at
1163 mapper initialization time. When using Declarative, it may also
1164 be a string argument noting the name of a :class:`_schema.Table`
1165 that is
1166 present in the :class:`_schema.MetaData`
1167 collection associated with the
1168 parent-mapped :class:`_schema.Table`.
1169
1170 .. versionchanged:: 2.1 When passed as a string, the argument is
1171 interpreted as a string name that should exist directly in the
1172 registry of tables. The Python ``eval()`` function is no longer
1173 used for the :paramref:`_orm.relationship.secondary` argument when
1174 passed as a string.
1175
1176 The :paramref:`_orm.relationship.secondary` keyword argument is
1177 typically applied in the case where the intermediary
1178 :class:`_schema.Table`
1179 is not otherwise expressed in any direct class mapping. If the
1180 "secondary" table is also explicitly mapped elsewhere (e.g. as in
1181 :ref:`association_pattern`), one should consider applying the
1182 :paramref:`_orm.relationship.viewonly` flag so that this
1183 :func:`_orm.relationship`
1184 is not used for persistence operations which
1185 may conflict with those of the association object pattern.
1186
1187 .. seealso::
1188
1189 :ref:`relationships_many_to_many` - Reference example of "many
1190 to many".
1191
1192 :ref:`self_referential_many_to_many` - Specifics on using
1193 many-to-many in a self-referential case.
1194
1195 :ref:`declarative_many_to_many` - Additional options when using
1196 Declarative.
1197
1198 :ref:`association_pattern` - an alternative to
1199 :paramref:`_orm.relationship.secondary`
1200 when composing association
1201 table relationships, allowing additional attributes to be
1202 specified on the association table.
1203
1204 :ref:`composite_secondary_join` - a lesser-used pattern which
1205 in some cases can enable complex :func:`_orm.relationship` SQL
1206 conditions to be used.
1207
1208 :param active_history=False:
1209 When ``True``, indicates that the "previous" value for a
1210 many-to-one reference should be loaded when replaced, if
1211 not already loaded. Normally, history tracking logic for
1212 simple many-to-ones only needs to be aware of the "new"
1213 value in order to perform a flush. This flag is available
1214 for applications that make use of
1215 :func:`.attributes.get_history` which also need to know
1216 the "previous" value of the attribute.
1217
1218 :param backref:
1219 A reference to a string relationship name, or a :func:`_orm.backref`
1220 construct, which will be used to automatically generate a new
1221 :func:`_orm.relationship` on the related class, which then refers to this
1222 one using a bi-directional :paramref:`_orm.relationship.back_populates`
1223 configuration.
1224
1225 In modern Python, explicit use of :func:`_orm.relationship`
1226 with :paramref:`_orm.relationship.back_populates` should be preferred,
1227 as it is more robust in terms of mapper configuration as well as
1228 more conceptually straightforward. It also integrates with
1229 new :pep:`484` typing features introduced in SQLAlchemy 2.0 which
1230 is not possible with dynamically generated attributes.
1231
1232 .. seealso::
1233
1234 :ref:`relationships_backref` - notes on using
1235 :paramref:`_orm.relationship.backref`
1236
1237 :ref:`tutorial_orm_related_objects` - in the :ref:`unified_tutorial`,
1238 presents an overview of bi-directional relationship configuration
1239 and behaviors using :paramref:`_orm.relationship.back_populates`
1240
1241 :func:`.backref` - allows control over :func:`_orm.relationship`
1242 configuration when using :paramref:`_orm.relationship.backref`.
1243
1244
1245 :param back_populates:
1246 Indicates the name of a :func:`_orm.relationship` on the related
1247 class that will be synchronized with this one. It is usually
1248 expected that the :func:`_orm.relationship` on the related class
1249 also refer to this one. This allows objects on both sides of
1250 each :func:`_orm.relationship` to synchronize in-Python state
1251 changes and also provides directives to the :term:`unit of work`
1252 flush process how changes along these relationships should
1253 be persisted.
1254
1255 .. seealso::
1256
1257 :ref:`tutorial_orm_related_objects` - in the :ref:`unified_tutorial`,
1258 presents an overview of bi-directional relationship configuration
1259 and behaviors.
1260
1261 :ref:`relationship_patterns` - includes many examples of
1262 :paramref:`_orm.relationship.back_populates`.
1263
1264 :paramref:`_orm.relationship.backref` - legacy form which allows
1265 more succinct configuration, but does not support explicit typing
1266
1267 :param overlaps:
1268 A string name or comma-delimited set of names of other relationships
1269 on either this mapper, a descendant mapper, or a target mapper with
1270 which this relationship may write to the same foreign keys upon
1271 persistence. The only effect this has is to eliminate the
1272 warning that this relationship will conflict with another upon
1273 persistence. This is used for such relationships that are truly
1274 capable of conflicting with each other on write, but the application
1275 will ensure that no such conflicts occur.
1276
1277 .. versionadded:: 1.4
1278
1279 .. seealso::
1280
1281 :ref:`error_qzyx` - usage example
1282
1283 :param cascade:
1284 A comma-separated list of cascade rules which determines how
1285 Session operations should be "cascaded" from parent to child.
1286 This defaults to ``False``, which means the default cascade
1287 should be used - this default cascade is ``"save-update, merge"``.
1288
1289 The available cascades are ``save-update``, ``merge``,
1290 ``expunge``, ``delete``, ``delete-orphan``, and ``refresh-expire``.
1291 An additional option, ``all`` indicates shorthand for
1292 ``"save-update, merge, refresh-expire,
1293 expunge, delete"``, and is often used as in ``"all, delete-orphan"``
1294 to indicate that related objects should follow along with the
1295 parent object in all cases, and be deleted when de-associated.
1296
1297 .. seealso::
1298
1299 :ref:`unitofwork_cascades` - Full detail on each of the available
1300 cascade options.
1301
1302 :param cascade_backrefs=False:
1303 Legacy; this flag is always False.
1304
1305 .. versionchanged:: 2.0 "cascade_backrefs" functionality has been
1306 removed.
1307
1308 :param collection_class:
1309 A class or callable that returns a new list-holding object. will
1310 be used in place of a plain list for storing elements.
1311
1312 .. seealso::
1313
1314 :ref:`custom_collections` - Introductory documentation and
1315 examples.
1316
1317 :param comparator_factory:
1318 A class which extends :class:`.Relationship.Comparator`
1319 which provides custom SQL clause generation for comparison
1320 operations.
1321
1322 .. seealso::
1323
1324 :class:`.PropComparator` - some detail on redefining comparators
1325 at this level.
1326
1327 :ref:`custom_comparators` - Brief intro to this feature.
1328
1329
1330 :param distinct_target_key=None:
1331 Indicate if a "subquery" eager load should apply the DISTINCT
1332 keyword to the innermost SELECT statement. When left as ``None``,
1333 the DISTINCT keyword will be applied in those cases when the target
1334 columns do not comprise the full primary key of the target table.
1335 When set to ``True``, the DISTINCT keyword is applied to the
1336 innermost SELECT unconditionally.
1337
1338 It may be desirable to set this flag to False when the DISTINCT is
1339 reducing performance of the innermost subquery beyond that of what
1340 duplicate innermost rows may be causing.
1341
1342 .. seealso::
1343
1344 :ref:`loading_toplevel` - includes an introduction to subquery
1345 eager loading.
1346
1347 :param doc:
1348 Docstring which will be applied to the resulting descriptor.
1349
1350 :param foreign_keys:
1351
1352 A list of columns which are to be used as "foreign key"
1353 columns, or columns which refer to the value in a remote
1354 column, within the context of this :func:`_orm.relationship`
1355 object's :paramref:`_orm.relationship.primaryjoin` condition.
1356 That is, if the :paramref:`_orm.relationship.primaryjoin`
1357 condition of this :func:`_orm.relationship` is ``a.id ==
1358 b.a_id``, and the values in ``b.a_id`` are required to be
1359 present in ``a.id``, then the "foreign key" column of this
1360 :func:`_orm.relationship` is ``b.a_id``.
1361
1362 In normal cases, the :paramref:`_orm.relationship.foreign_keys`
1363 parameter is **not required.** :func:`_orm.relationship` will
1364 automatically determine which columns in the
1365 :paramref:`_orm.relationship.primaryjoin` condition are to be
1366 considered "foreign key" columns based on those
1367 :class:`_schema.Column` objects that specify
1368 :class:`_schema.ForeignKey`,
1369 or are otherwise listed as referencing columns in a
1370 :class:`_schema.ForeignKeyConstraint` construct.
1371 :paramref:`_orm.relationship.foreign_keys` is only needed when:
1372
1373 1. There is more than one way to construct a join from the local
1374 table to the remote table, as there are multiple foreign key
1375 references present. Setting ``foreign_keys`` will limit the
1376 :func:`_orm.relationship`
1377 to consider just those columns specified
1378 here as "foreign".
1379
1380 2. The :class:`_schema.Table` being mapped does not actually have
1381 :class:`_schema.ForeignKey` or
1382 :class:`_schema.ForeignKeyConstraint`
1383 constructs present, often because the table
1384 was reflected from a database that does not support foreign key
1385 reflection (MySQL MyISAM).
1386
1387 3. The :paramref:`_orm.relationship.primaryjoin`
1388 argument is used to
1389 construct a non-standard join condition, which makes use of
1390 columns or expressions that do not normally refer to their
1391 "parent" column, such as a join condition expressed by a
1392 complex comparison using a SQL function.
1393
1394 The :func:`_orm.relationship` construct will raise informative
1395 error messages that suggest the use of the
1396 :paramref:`_orm.relationship.foreign_keys` parameter when
1397 presented with an ambiguous condition. In typical cases,
1398 if :func:`_orm.relationship` doesn't raise any exceptions, the
1399 :paramref:`_orm.relationship.foreign_keys` parameter is usually
1400 not needed.
1401
1402 :paramref:`_orm.relationship.foreign_keys` may also be passed as a
1403 callable function which is evaluated at mapper initialization time,
1404 and may be passed as a Python-evaluable string when using
1405 Declarative.
1406
1407 .. warning:: When passed as a Python-evaluable string, the
1408 argument is interpreted using Python's ``eval()`` function.
1409 **DO NOT PASS UNTRUSTED INPUT TO THIS STRING**.
1410 See :ref:`declarative_relationship_eval` for details on
1411 declarative evaluation of :func:`_orm.relationship` arguments.
1412
1413 .. seealso::
1414
1415 :ref:`relationship_foreign_keys`
1416
1417 :ref:`relationship_custom_foreign`
1418
1419 :func:`.foreign` - allows direct annotation of the "foreign"
1420 columns within a :paramref:`_orm.relationship.primaryjoin`
1421 condition.
1422
1423 :param info: Optional data dictionary which will be populated into the
1424 :attr:`.MapperProperty.info` attribute of this object.
1425
1426 :param innerjoin=False:
1427 When ``True``, joined eager loads will use an inner join to join
1428 against related tables instead of an outer join. The purpose
1429 of this option is generally one of performance, as inner joins
1430 generally perform better than outer joins.
1431
1432 This flag can be set to ``True`` when the relationship references an
1433 object via many-to-one using local foreign keys that are not
1434 nullable, or when the reference is one-to-one or a collection that
1435 is guaranteed to have one or at least one entry.
1436
1437 The option supports the same "nested" and "unnested" options as
1438 that of :paramref:`_orm.joinedload.innerjoin`. See that flag
1439 for details on nested / unnested behaviors.
1440
1441 .. seealso::
1442
1443 :paramref:`_orm.joinedload.innerjoin` - the option as specified by
1444 loader option, including detail on nesting behavior.
1445
1446 :ref:`what_kind_of_loading` - Discussion of some details of
1447 various loader options.
1448
1449
1450 :param join_depth:
1451 When non-``None``, an integer value indicating how many levels
1452 deep "eager" loaders should join on a self-referring or cyclical
1453 relationship. The number counts how many times the same Mapper
1454 shall be present in the loading condition along a particular join
1455 branch. When left at its default of ``None``, eager loaders
1456 will stop chaining when they encounter a the same target mapper
1457 which is already higher up in the chain. This option applies
1458 both to joined- and subquery- eager loaders.
1459
1460 .. seealso::
1461
1462 :ref:`self_referential_eager_loading` - Introductory documentation
1463 and examples.
1464
1465 :param lazy='select': specifies
1466 How the related items should be loaded. Default value is
1467 ``select``. Values include:
1468
1469 * ``select`` - items should be loaded lazily when the property is
1470 first accessed, using a separate SELECT statement, or identity map
1471 fetch for simple many-to-one references.
1472
1473 * ``immediate`` - items should be loaded as the parents are loaded,
1474 using a separate SELECT statement, or identity map fetch for
1475 simple many-to-one references.
1476
1477 * ``joined`` - items should be loaded "eagerly" in the same query as
1478 that of the parent, using a JOIN or LEFT OUTER JOIN. Whether
1479 the join is "outer" or not is determined by the
1480 :paramref:`_orm.relationship.innerjoin` parameter.
1481
1482 * ``subquery`` - items should be loaded "eagerly" as the parents are
1483 loaded, using one additional SQL statement, which issues a JOIN to
1484 a subquery of the original statement, for each collection
1485 requested.
1486
1487 * ``selectin`` - items should be loaded "eagerly" as the parents
1488 are loaded, using one or more additional SQL statements, which
1489 issues a JOIN to the immediate parent object, specifying primary
1490 key identifiers using an IN clause.
1491
1492 * ``raise`` - lazy loading is disallowed; accessing
1493 the attribute, if its value were not already loaded via eager
1494 loading, will raise an :exc:`~sqlalchemy.exc.InvalidRequestError`.
1495 This strategy can be used when objects are to be detached from
1496 their attached :class:`.Session` after they are loaded.
1497
1498 * ``raise_on_sql`` - lazy loading that emits SQL is disallowed;
1499 accessing the attribute, if its value were not already loaded via
1500 eager loading, will raise an
1501 :exc:`~sqlalchemy.exc.InvalidRequestError`, **if the lazy load
1502 needs to emit SQL**. If the lazy load can pull the related value
1503 from the identity map or determine that it should be None, the
1504 value is loaded. This strategy can be used when objects will
1505 remain associated with the attached :class:`.Session`, however
1506 additional SELECT statements should be blocked.
1507
1508 * ``write_only`` - the attribute will be configured with a special
1509 "virtual collection" that may receive
1510 :meth:`_orm.WriteOnlyCollection.add` and
1511 :meth:`_orm.WriteOnlyCollection.remove` commands to add or remove
1512 individual objects, but will not under any circumstances load or
1513 iterate the full set of objects from the database directly. Instead,
1514 methods such as :meth:`_orm.WriteOnlyCollection.select`,
1515 :meth:`_orm.WriteOnlyCollection.insert`,
1516 :meth:`_orm.WriteOnlyCollection.update` and
1517 :meth:`_orm.WriteOnlyCollection.delete` are provided which generate SQL
1518 constructs that may be used to load and modify rows in bulk. Used for
1519 large collections that are never appropriate to load at once into
1520 memory.
1521
1522 The ``write_only`` loader style is configured automatically when
1523 the :class:`_orm.WriteOnlyMapped` annotation is provided on the
1524 left hand side within a Declarative mapping. See the section
1525 :ref:`write_only_relationship` for examples.
1526
1527 .. versionadded:: 2.0
1528
1529 .. seealso::
1530
1531 :ref:`write_only_relationship` - in the :ref:`queryguide_toplevel`
1532
1533 * ``dynamic`` - the attribute will return a pre-configured
1534 :class:`_query.Query` object for all read
1535 operations, onto which further filtering operations can be
1536 applied before iterating the results.
1537
1538 The ``dynamic`` loader style is configured automatically when
1539 the :class:`_orm.DynamicMapped` annotation is provided on the
1540 left hand side within a Declarative mapping. See the section
1541 :ref:`dynamic_relationship` for examples.
1542
1543 .. legacy:: The "dynamic" lazy loader strategy is the legacy form of
1544 what is now the "write_only" strategy described in the section
1545 :ref:`write_only_relationship`.
1546
1547 .. seealso::
1548
1549 :ref:`dynamic_relationship` - in the :ref:`queryguide_toplevel`
1550
1551 :ref:`write_only_relationship` - more generally useful approach
1552 for large collections that should not fully load into memory
1553
1554 * ``noload`` - no loading should occur at any time. The related
1555 collection will remain empty.
1556
1557 .. deprecated:: 2.1 The ``noload`` loader strategy is deprecated and
1558 will be removed in a future release. This option produces incorrect
1559 results by returning ``None`` for related items.
1560
1561 * True - a synonym for 'select'
1562
1563 * False - a synonym for 'joined'
1564
1565 * None - a synonym for 'noload'
1566
1567 .. seealso::
1568
1569 :ref:`orm_queryguide_relationship_loaders` - Full documentation on
1570 relationship loader configuration in the :ref:`queryguide_toplevel`.
1571
1572
1573 :param load_on_pending=False:
1574 Indicates loading behavior for transient or pending parent objects.
1575
1576 When set to ``True``, causes the lazy-loader to
1577 issue a query for a parent object that is not persistent, meaning it
1578 has never been flushed. This may take effect for a pending object
1579 when autoflush is disabled, or for a transient object that has been
1580 "attached" to a :class:`.Session` but is not part of its pending
1581 collection.
1582
1583 The :paramref:`_orm.relationship.load_on_pending`
1584 flag does not improve
1585 behavior when the ORM is used normally - object references should be
1586 constructed at the object level, not at the foreign key level, so
1587 that they are present in an ordinary way before a flush proceeds.
1588 This flag is not not intended for general use.
1589
1590 .. seealso::
1591
1592 :meth:`.Session.enable_relationship_loading` - this method
1593 establishes "load on pending" behavior for the whole object, and
1594 also allows loading on objects that remain transient or
1595 detached.
1596
1597 :param order_by:
1598 Indicates the ordering that should be applied when loading these
1599 items. :paramref:`_orm.relationship.order_by`
1600 is expected to refer to
1601 one of the :class:`_schema.Column`
1602 objects to which the target class is
1603 mapped, or the attribute itself bound to the target class which
1604 refers to the column.
1605
1606 :paramref:`_orm.relationship.order_by`
1607 may also be passed as a callable
1608 function which is evaluated at mapper initialization time, and may
1609 be passed as a Python-evaluable string when using Declarative.
1610
1611 .. warning:: When passed as a Python-evaluable string, the
1612 argument is interpreted using Python's ``eval()`` function.
1613 **DO NOT PASS UNTRUSTED INPUT TO THIS STRING**.
1614 See :ref:`declarative_relationship_eval` for details on
1615 declarative evaluation of :func:`_orm.relationship` arguments.
1616
1617 :param passive_deletes=False:
1618 Indicates loading behavior during delete operations.
1619
1620 A value of True indicates that unloaded child items should not
1621 be loaded during a delete operation on the parent. Normally,
1622 when a parent item is deleted, all child items are loaded so
1623 that they can either be marked as deleted, or have their
1624 foreign key to the parent set to NULL. Marking this flag as
1625 True usually implies an ON DELETE <CASCADE|SET NULL> rule is in
1626 place which will handle updating/deleting child rows on the
1627 database side.
1628
1629 Additionally, setting the flag to the string value 'all' will
1630 disable the "nulling out" of the child foreign keys, when the parent
1631 object is deleted and there is no delete or delete-orphan cascade
1632 enabled. This is typically used when a triggering or error raise
1633 scenario is in place on the database side. Note that the foreign
1634 key attributes on in-session child objects will not be changed after
1635 a flush occurs so this is a very special use-case setting.
1636 Additionally, the "nulling out" will still occur if the child
1637 object is de-associated with the parent.
1638
1639 .. seealso::
1640
1641 :ref:`passive_deletes` - Introductory documentation
1642 and examples.
1643
1644 :param passive_updates=True:
1645 Indicates the persistence behavior to take when a referenced
1646 primary key value changes in place, indicating that the referencing
1647 foreign key columns will also need their value changed.
1648
1649 When True, it is assumed that ``ON UPDATE CASCADE`` is configured on
1650 the foreign key in the database, and that the database will
1651 handle propagation of an UPDATE from a source column to
1652 dependent rows. When False, the SQLAlchemy
1653 :func:`_orm.relationship`
1654 construct will attempt to emit its own UPDATE statements to
1655 modify related targets. However note that SQLAlchemy **cannot**
1656 emit an UPDATE for more than one level of cascade. Also,
1657 setting this flag to False is not compatible in the case where
1658 the database is in fact enforcing referential integrity, unless
1659 those constraints are explicitly "deferred", if the target backend
1660 supports it.
1661
1662 It is highly advised that an application which is employing
1663 mutable primary keys keeps ``passive_updates`` set to True,
1664 and instead uses the referential integrity features of the database
1665 itself in order to handle the change efficiently and fully.
1666
1667 .. seealso::
1668
1669 :ref:`passive_updates` - Introductory documentation and
1670 examples.
1671
1672 :paramref:`.mapper.passive_updates` - a similar flag which
1673 takes effect for joined-table inheritance mappings.
1674
1675 :param post_update:
1676 This indicates that the relationship should be handled by a
1677 second UPDATE statement after an INSERT or before a
1678 DELETE. This flag is used to handle saving bi-directional
1679 dependencies between two individual rows (i.e. each row
1680 references the other), where it would otherwise be impossible to
1681 INSERT or DELETE both rows fully since one row exists before the
1682 other. Use this flag when a particular mapping arrangement will
1683 incur two rows that are dependent on each other, such as a table
1684 that has a one-to-many relationship to a set of child rows, and
1685 also has a column that references a single child row within that
1686 list (i.e. both tables contain a foreign key to each other). If
1687 a flush operation returns an error that a "cyclical
1688 dependency" was detected, this is a cue that you might want to
1689 use :paramref:`_orm.relationship.post_update` to "break" the cycle.
1690
1691 .. seealso::
1692
1693 :ref:`post_update` - Introductory documentation and examples.
1694
1695 :param primaryjoin:
1696 A SQL expression that will be used as the primary
1697 join of the child object against the parent object, or in a
1698 many-to-many relationship the join of the parent object to the
1699 association table. By default, this value is computed based on the
1700 foreign key relationships of the parent and child tables (or
1701 association table).
1702
1703 :paramref:`_orm.relationship.primaryjoin` may also be passed as a
1704 callable function which is evaluated at mapper initialization time,
1705 and may be passed as a Python-evaluable string when using
1706 Declarative.
1707
1708 .. warning:: When passed as a Python-evaluable string, the
1709 argument is interpreted using Python's ``eval()`` function.
1710 **DO NOT PASS UNTRUSTED INPUT TO THIS STRING**.
1711 See :ref:`declarative_relationship_eval` for details on
1712 declarative evaluation of :func:`_orm.relationship` arguments.
1713
1714 .. seealso::
1715
1716 :ref:`relationship_primaryjoin`
1717
1718 :param remote_side:
1719 Used for self-referential relationships, indicates the column or
1720 list of columns that form the "remote side" of the relationship.
1721
1722 :paramref:`_orm.relationship.remote_side` may also be passed as a
1723 callable function which is evaluated at mapper initialization time,
1724 and may be passed as a Python-evaluable string when using
1725 Declarative.
1726
1727 .. warning:: When passed as a Python-evaluable string, the
1728 argument is interpreted using Python's ``eval()`` function.
1729 **DO NOT PASS UNTRUSTED INPUT TO THIS STRING**.
1730 See :ref:`declarative_relationship_eval` for details on
1731 declarative evaluation of :func:`_orm.relationship` arguments.
1732
1733 .. seealso::
1734
1735 :ref:`self_referential` - in-depth explanation of how
1736 :paramref:`_orm.relationship.remote_side`
1737 is used to configure self-referential relationships.
1738
1739 :func:`.remote` - an annotation function that accomplishes the
1740 same purpose as :paramref:`_orm.relationship.remote_side`,
1741 typically
1742 when a custom :paramref:`_orm.relationship.primaryjoin` condition
1743 is used.
1744
1745 :param query_class:
1746 A :class:`_query.Query`
1747 subclass that will be used internally by the
1748 ``AppenderQuery`` returned by a "dynamic" relationship, that
1749 is, a relationship that specifies ``lazy="dynamic"`` or was
1750 otherwise constructed using the :func:`_orm.dynamic_loader`
1751 function.
1752
1753 .. seealso::
1754
1755 :ref:`dynamic_relationship` - Introduction to "dynamic"
1756 relationship loaders.
1757
1758 :param secondaryjoin:
1759 A SQL expression that will be used as the join of
1760 an association table to the child object. By default, this value is
1761 computed based on the foreign key relationships of the association
1762 and child tables.
1763
1764 :paramref:`_orm.relationship.secondaryjoin` may also be passed as a
1765 callable function which is evaluated at mapper initialization time,
1766 and may be passed as a Python-evaluable string when using
1767 Declarative.
1768
1769 .. warning:: When passed as a Python-evaluable string, the
1770 argument is interpreted using Python's ``eval()`` function.
1771 **DO NOT PASS UNTRUSTED INPUT TO THIS STRING**.
1772 See :ref:`declarative_relationship_eval` for details on
1773 declarative evaluation of :func:`_orm.relationship` arguments.
1774
1775 .. seealso::
1776
1777 :ref:`relationship_primaryjoin`
1778
1779 :param single_parent:
1780 When True, installs a validator which will prevent objects
1781 from being associated with more than one parent at a time.
1782 This is used for many-to-one or many-to-many relationships that
1783 should be treated either as one-to-one or one-to-many. Its usage
1784 is optional, except for :func:`_orm.relationship` constructs which
1785 are many-to-one or many-to-many and also
1786 specify the ``delete-orphan`` cascade option. The
1787 :func:`_orm.relationship` construct itself will raise an error
1788 instructing when this option is required.
1789
1790 .. seealso::
1791
1792 :ref:`unitofwork_cascades` - includes detail on when the
1793 :paramref:`_orm.relationship.single_parent`
1794 flag may be appropriate.
1795
1796 :param uselist:
1797 A boolean that indicates if this property should be loaded as a
1798 list or a scalar. In most cases, this value is determined
1799 automatically by :func:`_orm.relationship` at mapper configuration
1800 time. When using explicit :class:`_orm.Mapped` annotations,
1801 :paramref:`_orm.relationship.uselist` may be derived from the
1802 whether or not the annotation within :class:`_orm.Mapped` contains
1803 a collection class.
1804 Otherwise, :paramref:`_orm.relationship.uselist` may be derived from
1805 the type and direction
1806 of the relationship - one to many forms a list, many to one
1807 forms a scalar, many to many is a list. If a scalar is desired
1808 where normally a list would be present, such as a bi-directional
1809 one-to-one relationship, use an appropriate :class:`_orm.Mapped`
1810 annotation or set :paramref:`_orm.relationship.uselist` to False.
1811
1812 The :paramref:`_orm.relationship.uselist`
1813 flag is also available on an
1814 existing :func:`_orm.relationship`
1815 construct as a read-only attribute,
1816 which can be used to determine if this :func:`_orm.relationship`
1817 deals
1818 with collections or scalar attributes::
1819
1820 >>> User.addresses.property.uselist
1821 True
1822
1823 .. seealso::
1824
1825 :ref:`relationships_one_to_one` - Introduction to the "one to
1826 one" relationship pattern, which is typically when an alternate
1827 setting for :paramref:`_orm.relationship.uselist` is involved.
1828
1829 :param viewonly=False:
1830 When set to ``True``, the relationship is used only for loading
1831 objects, and not for any persistence operation. A
1832 :func:`_orm.relationship` which specifies
1833 :paramref:`_orm.relationship.viewonly` can work
1834 with a wider range of SQL operations within the
1835 :paramref:`_orm.relationship.primaryjoin` condition, including
1836 operations that feature the use of a variety of comparison operators
1837 as well as SQL functions such as :func:`_expression.cast`. The
1838 :paramref:`_orm.relationship.viewonly`
1839 flag is also of general use when defining any kind of
1840 :func:`_orm.relationship` that doesn't represent
1841 the full set of related objects, to prevent modifications of the
1842 collection from resulting in persistence operations.
1843
1844 .. seealso::
1845
1846 :ref:`relationship_viewonly_notes` - more details on best practices
1847 when using :paramref:`_orm.relationship.viewonly`.
1848
1849 :param sync_backref:
1850 A boolean that enables the events used to synchronize the in-Python
1851 attributes when this relationship is target of either
1852 :paramref:`_orm.relationship.backref` or
1853 :paramref:`_orm.relationship.back_populates`.
1854
1855 Defaults to ``None``, which indicates that an automatic value should
1856 be selected based on the value of the
1857 :paramref:`_orm.relationship.viewonly` flag. When left at its
1858 default, changes in state will be back-populated only if neither
1859 sides of a relationship is viewonly.
1860
1861 .. versionchanged:: 1.4 - A relationship that specifies
1862 :paramref:`_orm.relationship.viewonly` automatically implies
1863 that :paramref:`_orm.relationship.sync_backref` is ``False``.
1864
1865 .. seealso::
1866
1867 :paramref:`_orm.relationship.viewonly`
1868
1869 :param omit_join:
1870 Allows manual control over the "selectin" automatic join
1871 optimization. Set to ``False`` to disable the "omit join" feature
1872 added in SQLAlchemy 1.3; or leave as ``None`` to leave automatic
1873 optimization in place.
1874
1875 .. note:: This flag may only be set to ``False``. It is not
1876 necessary to set it to ``True`` as the "omit_join" optimization is
1877 automatically detected; if it is not detected, then the
1878 optimization is not supported.
1879
1880 :param default: Specific to :ref:`orm_declarative_native_dataclasses`,
1881 specifies an immutable scalar default value for the relationship that
1882 will behave as though it is the default value for the parameter in the
1883 ``__init__()`` method. This is only supported for a ``uselist=False``
1884 relationship, that is many-to-one or one-to-one, and only supports the
1885 scalar value ``None``, since no other immutable value is valid for such a
1886 relationship.
1887
1888 .. versionchanged:: 2.1 the :paramref:`_orm.relationship.default`
1889 parameter only supports a value of ``None``.
1890
1891 :param init: Specific to :ref:`orm_declarative_native_dataclasses`,
1892 specifies if the mapped attribute should be part of the ``__init__()``
1893 method as generated by the dataclass process.
1894 :param repr: Specific to :ref:`orm_declarative_native_dataclasses`,
1895 specifies if the mapped attribute should be part of the ``__repr__()``
1896 method as generated by the dataclass process.
1897 :param default_factory: Specific to
1898 :ref:`orm_declarative_native_dataclasses`,
1899 specifies a default-value generation function that will take place
1900 as part of the ``__init__()``
1901 method as generated by the dataclass process.
1902 :param compare: Specific to
1903 :ref:`orm_declarative_native_dataclasses`, indicates if this field
1904 should be included in comparison operations when generating the
1905 ``__eq__()`` and ``__ne__()`` methods for the mapped class.
1906
1907 .. versionadded:: 2.0.0b4
1908
1909 :param kw_only: Specific to
1910 :ref:`orm_declarative_native_dataclasses`, indicates if this field
1911 should be marked as keyword-only when generating the ``__init__()``.
1912
1913 :param hash: Specific to
1914 :ref:`orm_declarative_native_dataclasses`, controls if this field
1915 is included when generating the ``__hash__()`` method for the mapped
1916 class.
1917
1918 .. versionadded:: 2.0.36
1919
1920 :param dataclass_metadata: Specific to
1921 :ref:`orm_declarative_native_dataclasses`, supplies metadata
1922 to be attached to the generated dataclass field.
1923
1924 .. versionadded:: 2.0.42
1925
1926 """
1927
1928 return _RelationshipDeclared(
1929 argument,
1930 secondary=secondary,
1931 uselist=uselist,
1932 collection_class=collection_class,
1933 primaryjoin=primaryjoin,
1934 secondaryjoin=secondaryjoin,
1935 back_populates=back_populates,
1936 order_by=order_by,
1937 backref=backref,
1938 overlaps=overlaps,
1939 post_update=post_update,
1940 cascade=cascade,
1941 viewonly=viewonly,
1942 attribute_options=_AttributeOptions(
1943 init,
1944 repr,
1945 default,
1946 default_factory,
1947 compare,
1948 kw_only,
1949 hash,
1950 dataclass_metadata,
1951 ),
1952 lazy=lazy,
1953 passive_deletes=passive_deletes,
1954 passive_updates=passive_updates,
1955 active_history=active_history,
1956 enable_typechecks=enable_typechecks,
1957 foreign_keys=foreign_keys,
1958 remote_side=remote_side,
1959 join_depth=join_depth,
1960 comparator_factory=comparator_factory,
1961 single_parent=single_parent,
1962 innerjoin=innerjoin,
1963 distinct_target_key=distinct_target_key,
1964 load_on_pending=load_on_pending,
1965 query_class=query_class,
1966 info=info,
1967 omit_join=omit_join,
1968 sync_backref=sync_backref,
1969 **kw,
1970 )
1971
1972
1973def synonym(
1974 name: str,
1975 *,
1976 map_column: Optional[bool] = None,
1977 descriptor: Optional[Any] = None,
1978 comparator_factory: Optional[Type[PropComparator[_T]]] = None,
1979 init: Union[_NoArg, bool] = _NoArg.NO_ARG,
1980 repr: Union[_NoArg, bool] = _NoArg.NO_ARG, # noqa: A002
1981 default: Union[_NoArg, _T] = _NoArg.NO_ARG,
1982 default_factory: Union[_NoArg, Callable[[], _T]] = _NoArg.NO_ARG,
1983 compare: Union[_NoArg, bool] = _NoArg.NO_ARG,
1984 kw_only: Union[_NoArg, bool] = _NoArg.NO_ARG,
1985 hash: Union[_NoArg, bool, None] = _NoArg.NO_ARG, # noqa: A002
1986 info: Optional[_InfoType] = None,
1987 doc: Optional[str] = None,
1988 dataclass_metadata: Union[_NoArg, Mapping[Any, Any], None] = _NoArg.NO_ARG,
1989) -> Synonym[Any]:
1990 """Denote an attribute name as a synonym to a mapped property,
1991 in that the attribute will mirror the value and expression behavior
1992 of another attribute.
1993
1994 e.g.::
1995
1996 class MyClass(Base):
1997 __tablename__ = "my_table"
1998
1999 id = Column(Integer, primary_key=True)
2000 job_status = Column(String(50))
2001
2002 status = synonym("job_status")
2003
2004 :param name: the name of the existing mapped property. This
2005 can refer to the string name ORM-mapped attribute
2006 configured on the class, including column-bound attributes
2007 and relationships.
2008
2009 :param descriptor: a Python :term:`descriptor` that will be used
2010 as a getter (and potentially a setter) when this attribute is
2011 accessed at the instance level.
2012
2013 :param map_column: **For classical mappings and mappings against
2014 an existing Table object only**. if ``True``, the :func:`.synonym`
2015 construct will locate the :class:`_schema.Column`
2016 object upon the mapped
2017 table that would normally be associated with the attribute name of
2018 this synonym, and produce a new :class:`.ColumnProperty` that instead
2019 maps this :class:`_schema.Column`
2020 to the alternate name given as the "name"
2021 argument of the synonym; in this way, the usual step of redefining
2022 the mapping of the :class:`_schema.Column`
2023 to be under a different name is
2024 unnecessary. This is usually intended to be used when a
2025 :class:`_schema.Column`
2026 is to be replaced with an attribute that also uses a
2027 descriptor, that is, in conjunction with the
2028 :paramref:`.synonym.descriptor` parameter::
2029
2030 my_table = Table(
2031 "my_table",
2032 metadata,
2033 Column("id", Integer, primary_key=True),
2034 Column("job_status", String(50)),
2035 )
2036
2037
2038 class MyClass:
2039 @property
2040 def _job_status_descriptor(self):
2041 return "Status: %s" % self._job_status
2042
2043
2044 mapper(
2045 MyClass,
2046 my_table,
2047 properties={
2048 "job_status": synonym(
2049 "_job_status",
2050 map_column=True,
2051 descriptor=MyClass._job_status_descriptor,
2052 )
2053 },
2054 )
2055
2056 Above, the attribute named ``_job_status`` is automatically
2057 mapped to the ``job_status`` column::
2058
2059 >>> j1 = MyClass()
2060 >>> j1._job_status = "employed"
2061 >>> j1.job_status
2062 Status: employed
2063
2064 When using Declarative, in order to provide a descriptor in
2065 conjunction with a synonym, use the
2066 :func:`sqlalchemy.ext.declarative.synonym_for` helper. However,
2067 note that the :ref:`hybrid properties <mapper_hybrids>` feature
2068 should usually be preferred, particularly when redefining attribute
2069 behavior.
2070
2071 :param info: Optional data dictionary which will be populated into the
2072 :attr:`.InspectionAttr.info` attribute of this object.
2073
2074 :param comparator_factory: A subclass of :class:`.PropComparator`
2075 that will provide custom comparison behavior at the SQL expression
2076 level.
2077
2078 .. note::
2079
2080 For the use case of providing an attribute which redefines both
2081 Python-level and SQL-expression level behavior of an attribute,
2082 please refer to the Hybrid attribute introduced at
2083 :ref:`mapper_hybrids` for a more effective technique.
2084
2085 .. seealso::
2086
2087 :ref:`synonyms` - Overview of synonyms
2088
2089 :func:`.synonym_for` - a helper oriented towards Declarative
2090
2091 :ref:`mapper_hybrids` - The Hybrid Attribute extension provides an
2092 updated approach to augmenting attribute behavior more flexibly
2093 than can be achieved with synonyms.
2094
2095 """
2096 return Synonym(
2097 name,
2098 map_column=map_column,
2099 descriptor=descriptor,
2100 comparator_factory=comparator_factory,
2101 attribute_options=_AttributeOptions(
2102 init,
2103 repr,
2104 default,
2105 default_factory,
2106 compare,
2107 kw_only,
2108 hash,
2109 dataclass_metadata,
2110 ),
2111 doc=doc,
2112 info=info,
2113 )
2114
2115
2116def create_session(
2117 bind: Optional[_SessionBind] = None, **kwargs: Any
2118) -> Session:
2119 r"""Create a new :class:`.Session`
2120 with no automation enabled by default.
2121
2122 This function is used primarily for testing. The usual
2123 route to :class:`.Session` creation is via its constructor
2124 or the :func:`.sessionmaker` function.
2125
2126 :param bind: optional, a single Connectable to use for all
2127 database access in the created
2128 :class:`~sqlalchemy.orm.session.Session`.
2129
2130 :param \*\*kwargs: optional, passed through to the
2131 :class:`.Session` constructor.
2132
2133 :returns: an :class:`~sqlalchemy.orm.session.Session` instance
2134
2135 The defaults of create_session() are the opposite of that of
2136 :func:`sessionmaker`; ``autoflush`` and ``expire_on_commit`` are
2137 False.
2138
2139 Usage::
2140
2141 >>> from sqlalchemy.orm import create_session
2142 >>> session = create_session()
2143
2144 It is recommended to use :func:`sessionmaker` instead of
2145 create_session().
2146
2147 """
2148
2149 kwargs.setdefault("autoflush", False)
2150 kwargs.setdefault("expire_on_commit", False)
2151 return Session(bind=bind, **kwargs)
2152
2153
2154def _mapper_fn(*arg: Any, **kw: Any) -> NoReturn:
2155 """Placeholder for the now-removed ``mapper()`` function.
2156
2157 Classical mappings should be performed using the
2158 :meth:`_orm.registry.map_imperatively` method.
2159
2160 This symbol remains in SQLAlchemy 2.0 to suit the deprecated use case
2161 of using the ``mapper()`` function as a target for ORM event listeners,
2162 which failed to be marked as deprecated in the 1.4 series.
2163
2164 Global ORM mapper listeners should instead use the :class:`_orm.Mapper`
2165 class as the target.
2166
2167 .. versionchanged:: 2.0 The ``mapper()`` function was removed; the
2168 symbol remains temporarily as a placeholder for the event listening
2169 use case.
2170
2171 """
2172 raise InvalidRequestError(
2173 "The 'sqlalchemy.orm.mapper()' function is removed as of "
2174 "SQLAlchemy 2.0. Use the "
2175 "'sqlalchemy.orm.registry.map_imperatively()` "
2176 "method of the ``sqlalchemy.orm.registry`` class to perform "
2177 "classical mapping."
2178 )
2179
2180
2181def dynamic_loader(
2182 argument: Optional[_RelationshipArgumentType[Any]] = None, **kw: Any
2183) -> RelationshipProperty[Any]:
2184 """Construct a dynamically-loading mapper property.
2185
2186 This is essentially the same as
2187 using the ``lazy='dynamic'`` argument with :func:`relationship`::
2188
2189 dynamic_loader(SomeClass)
2190
2191 # is the same as
2192
2193 relationship(SomeClass, lazy="dynamic")
2194
2195 See the section :ref:`dynamic_relationship` for more details
2196 on dynamic loading.
2197
2198 """
2199 kw["lazy"] = "dynamic"
2200 return relationship(argument, **kw)
2201
2202
2203def backref(name: str, **kwargs: Any) -> ORMBackrefArgument:
2204 """When using the :paramref:`_orm.relationship.backref` parameter,
2205 provides specific parameters to be used when the new
2206 :func:`_orm.relationship` is generated.
2207
2208 E.g.::
2209
2210 "items": relationship(SomeItem, backref=backref("parent", lazy="subquery"))
2211
2212 The :paramref:`_orm.relationship.backref` parameter is generally
2213 considered to be legacy; for modern applications, using
2214 explicit :func:`_orm.relationship` constructs linked together using
2215 the :paramref:`_orm.relationship.back_populates` parameter should be
2216 preferred.
2217
2218 .. seealso::
2219
2220 :ref:`relationships_backref` - background on backrefs
2221
2222 """ # noqa: E501
2223
2224 return (name, kwargs)
2225
2226
2227def deferred(
2228 column: _ORMColumnExprArgument[_T],
2229 *additional_columns: _ORMColumnExprArgument[Any],
2230 group: Optional[str] = None,
2231 raiseload: bool = False,
2232 comparator_factory: Optional[Type[PropComparator[_T]]] = None,
2233 init: Union[_NoArg, bool] = _NoArg.NO_ARG,
2234 repr: Union[_NoArg, bool] = _NoArg.NO_ARG, # noqa: A002
2235 default: Optional[Any] = _NoArg.NO_ARG,
2236 default_factory: Union[_NoArg, Callable[[], _T]] = _NoArg.NO_ARG,
2237 compare: Union[_NoArg, bool] = _NoArg.NO_ARG,
2238 kw_only: Union[_NoArg, bool] = _NoArg.NO_ARG,
2239 hash: Union[_NoArg, bool, None] = _NoArg.NO_ARG, # noqa: A002
2240 active_history: bool = False,
2241 expire_on_flush: bool = True,
2242 info: Optional[_InfoType] = None,
2243 doc: Optional[str] = None,
2244 dataclass_metadata: Union[_NoArg, Mapping[Any, Any], None] = _NoArg.NO_ARG,
2245) -> MappedSQLExpression[_T]:
2246 r"""Indicate a column-based mapped attribute that by default will
2247 not load unless accessed.
2248
2249 When using :func:`_orm.mapped_column`, the same functionality as
2250 that of :func:`_orm.deferred` construct is provided by using the
2251 :paramref:`_orm.mapped_column.deferred` parameter.
2252
2253 :param \*columns: columns to be mapped. This is typically a single
2254 :class:`_schema.Column` object,
2255 however a collection is supported in order
2256 to support multiple columns mapped under the same attribute.
2257
2258 :param raiseload: boolean, if True, indicates an exception should be raised
2259 if the load operation is to take place.
2260
2261 .. versionadded:: 1.4
2262
2263
2264 Additional arguments are the same as that of :func:`_orm.column_property`.
2265
2266 .. seealso::
2267
2268 :ref:`orm_queryguide_deferred_imperative`
2269
2270 """
2271 return MappedSQLExpression(
2272 column,
2273 *additional_columns,
2274 attribute_options=_AttributeOptions(
2275 init,
2276 repr,
2277 default,
2278 default_factory,
2279 compare,
2280 kw_only,
2281 hash,
2282 dataclass_metadata,
2283 ),
2284 group=group,
2285 deferred=True,
2286 raiseload=raiseload,
2287 comparator_factory=comparator_factory,
2288 active_history=active_history,
2289 expire_on_flush=expire_on_flush,
2290 info=info,
2291 doc=doc,
2292 )
2293
2294
2295def query_expression(
2296 default_expr: _ORMColumnExprArgument[_T] = sql.null(),
2297 *,
2298 repr: Union[_NoArg, bool] = _NoArg.NO_ARG, # noqa: A002
2299 compare: Union[_NoArg, bool] = _NoArg.NO_ARG, # noqa: A002
2300 expire_on_flush: bool = True,
2301 info: Optional[_InfoType] = None,
2302 doc: Optional[str] = None,
2303) -> MappedSQLExpression[_T]:
2304 """Indicate an attribute that populates from a query-time SQL expression.
2305
2306 :param default_expr: Optional SQL expression object that will be used in
2307 all cases if not assigned later with :func:`_orm.with_expression`.
2308
2309 .. seealso::
2310
2311 :ref:`orm_queryguide_with_expression` - background and usage examples
2312
2313 """
2314 prop = MappedSQLExpression(
2315 default_expr,
2316 attribute_options=_AttributeOptions(
2317 False,
2318 repr,
2319 _NoArg.NO_ARG,
2320 _NoArg.NO_ARG,
2321 compare,
2322 _NoArg.NO_ARG,
2323 _NoArg.NO_ARG,
2324 _NoArg.NO_ARG,
2325 ),
2326 expire_on_flush=expire_on_flush,
2327 info=info,
2328 doc=doc,
2329 _assume_readonly_dc_attributes=True,
2330 )
2331
2332 prop.strategy_key = (("query_expression", True),)
2333 return prop
2334
2335
2336def clear_mappers() -> None:
2337 """Remove all mappers from all classes.
2338
2339 .. versionchanged:: 1.4 This function now locates all
2340 :class:`_orm.registry` objects and calls upon the
2341 :meth:`_orm.registry.dispose` method of each.
2342
2343 This function removes all instrumentation from classes and disposes
2344 of their associated mappers. Once called, the classes are unmapped
2345 and can be later re-mapped with new mappers.
2346
2347 :func:`.clear_mappers` is *not* for normal use, as there is literally no
2348 valid usage for it outside of very specific testing scenarios. Normally,
2349 mappers are permanent structural components of user-defined classes, and
2350 are never discarded independently of their class. If a mapped class
2351 itself is garbage collected, its mapper is automatically disposed of as
2352 well. As such, :func:`.clear_mappers` is only for usage in test suites
2353 that re-use the same classes with different mappings, which is itself an
2354 extremely rare use case - the only such use case is in fact SQLAlchemy's
2355 own test suite, and possibly the test suites of other ORM extension
2356 libraries which intend to test various combinations of mapper construction
2357 upon a fixed set of classes.
2358
2359 """
2360
2361 mapperlib._dispose_registries(mapperlib._all_registries(), False)
2362
2363
2364# I would really like a way to get the Type[] here that shows up
2365# in a different way in typing tools, however there is no current method
2366# that is accepted by mypy (subclass of Type[_O] works in pylance, rejected
2367# by mypy).
2368AliasedType = Annotated[Type[_O], "aliased"]
2369
2370
2371@overload
2372def aliased(
2373 element: Type[_O],
2374 alias: Optional[FromClause] = None,
2375 name: Optional[str] = None,
2376 flat: bool = False,
2377 adapt_on_names: bool = False,
2378) -> AliasedType[_O]: ...
2379
2380
2381@overload
2382def aliased(
2383 element: Union[AliasedClass[_O], Mapper[_O], AliasedInsp[_O]],
2384 alias: Optional[FromClause] = None,
2385 name: Optional[str] = None,
2386 flat: bool = False,
2387 adapt_on_names: bool = False,
2388) -> AliasedClass[_O]: ...
2389
2390
2391@overload
2392def aliased(
2393 element: FromClause,
2394 alias: None = None,
2395 name: Optional[str] = None,
2396 flat: bool = False,
2397 adapt_on_names: bool = False,
2398) -> FromClause: ...
2399
2400
2401def aliased(
2402 element: Union[_EntityType[_O], FromClause],
2403 alias: Optional[FromClause] = None,
2404 name: Optional[str] = None,
2405 flat: bool = False,
2406 adapt_on_names: bool = False,
2407) -> Union[AliasedClass[_O], FromClause, AliasedType[_O]]:
2408 """Produce an alias of the given element, usually an :class:`.AliasedClass`
2409 instance.
2410
2411 E.g.::
2412
2413 my_alias = aliased(MyClass)
2414
2415 stmt = select(MyClass, my_alias).filter(MyClass.id > my_alias.id)
2416 result = session.execute(stmt)
2417
2418 The :func:`.aliased` function is used to create an ad-hoc mapping of a
2419 mapped class to a new selectable. By default, a selectable is generated
2420 from the normally mapped selectable (typically a :class:`_schema.Table`
2421 ) using the
2422 :meth:`_expression.FromClause.alias` method. However, :func:`.aliased`
2423 can also be
2424 used to link the class to a new :func:`_expression.select` statement.
2425 Also, the :func:`.with_polymorphic` function is a variant of
2426 :func:`.aliased` that is intended to specify a so-called "polymorphic
2427 selectable", that corresponds to the union of several joined-inheritance
2428 subclasses at once.
2429
2430 For convenience, the :func:`.aliased` function also accepts plain
2431 :class:`_expression.FromClause` constructs, such as a
2432 :class:`_schema.Table` or
2433 :func:`_expression.select` construct. In those cases, the
2434 :meth:`_expression.FromClause.alias`
2435 method is called on the object and the new
2436 :class:`_expression.Alias` object returned. The returned
2437 :class:`_expression.Alias` is not
2438 ORM-mapped in this case.
2439
2440 .. seealso::
2441
2442 :ref:`tutorial_orm_entity_aliases` - in the :ref:`unified_tutorial`
2443
2444 :ref:`orm_queryguide_orm_aliases` - in the :ref:`queryguide_toplevel`
2445
2446 :param element: element to be aliased. Is normally a mapped class,
2447 but for convenience can also be a :class:`_expression.FromClause`
2448 element.
2449
2450 :param alias: Optional selectable unit to map the element to. This is
2451 usually used to link the object to a subquery, and should be an aliased
2452 select construct as one would produce from the
2453 :meth:`_query.Query.subquery` method or
2454 the :meth:`_expression.Select.subquery` or
2455 :meth:`_expression.Select.alias` methods of the :func:`_expression.select`
2456 construct.
2457
2458 :param name: optional string name to use for the alias, if not specified
2459 by the ``alias`` parameter. The name, among other things, forms the
2460 attribute name that will be accessible via tuples returned by a
2461 :class:`_query.Query` object. Not supported when creating aliases
2462 of :class:`_sql.Join` objects.
2463
2464 :param flat: Boolean, will be passed through to the
2465 :meth:`_expression.FromClause.alias` call so that aliases of
2466 :class:`_expression.Join` objects will alias the individual tables
2467 inside the join, rather than creating a subquery. This is generally
2468 supported by all modern databases with regards to right-nested joins
2469 and generally produces more efficient queries.
2470
2471 When :paramref:`_orm.aliased.flat` is combined with
2472 :paramref:`_orm.aliased.name`, the resulting joins will alias individual
2473 tables using a naming scheme similar to ``<prefix>_<tablename>``. This
2474 naming scheme is for visibility / debugging purposes only and the
2475 specific scheme is subject to change without notice.
2476
2477 .. versionadded:: 2.0.32 added support for combining
2478 :paramref:`_orm.aliased.name` with :paramref:`_orm.aliased.flat`.
2479 Previously, this would raise ``NotImplementedError``.
2480
2481 :param adapt_on_names: if True, more liberal "matching" will be used when
2482 mapping the mapped columns of the ORM entity to those of the
2483 given selectable - a name-based match will be performed if the
2484 given selectable doesn't otherwise have a column that corresponds
2485 to one on the entity. The use case for this is when associating
2486 an entity with some derived selectable such as one that uses
2487 aggregate functions::
2488
2489 class UnitPrice(Base):
2490 __tablename__ = "unit_price"
2491 ...
2492 unit_id = Column(Integer)
2493 price = Column(Numeric)
2494
2495
2496 aggregated_unit_price = (
2497 Session.query(func.sum(UnitPrice.price).label("price"))
2498 .group_by(UnitPrice.unit_id)
2499 .subquery()
2500 )
2501
2502 aggregated_unit_price = aliased(
2503 UnitPrice, alias=aggregated_unit_price, adapt_on_names=True
2504 )
2505
2506 Above, functions on ``aggregated_unit_price`` which refer to
2507 ``.price`` will return the
2508 ``func.sum(UnitPrice.price).label('price')`` column, as it is
2509 matched on the name "price". Ordinarily, the "price" function
2510 wouldn't have any "column correspondence" to the actual
2511 ``UnitPrice.price`` column as it is not a proxy of the original.
2512
2513 """
2514 return AliasedInsp._alias_factory(
2515 element,
2516 alias=alias,
2517 name=name,
2518 flat=flat,
2519 adapt_on_names=adapt_on_names,
2520 )
2521
2522
2523def with_polymorphic(
2524 base: Union[Type[_O], Mapper[_O]],
2525 classes: Union[Literal["*"], Iterable[Type[Any]]],
2526 selectable: Union[Literal[False, None], FromClause] = False,
2527 flat: bool = False,
2528 polymorphic_on: Optional[ColumnElement[Any]] = None,
2529 aliased: bool = False,
2530 innerjoin: bool = False,
2531 adapt_on_names: bool = False,
2532 name: Optional[str] = None,
2533 _use_mapper_path: bool = False,
2534) -> AliasedClass[_O]:
2535 """Produce an :class:`.AliasedClass` construct which specifies
2536 columns for descendant mappers of the given base.
2537
2538 Using this method will ensure that each descendant mapper's
2539 tables are included in the FROM clause, and will allow filter()
2540 criterion to be used against those tables. The resulting
2541 instances will also have those columns already loaded so that
2542 no "post fetch" of those columns will be required.
2543
2544 .. seealso::
2545
2546 :ref:`with_polymorphic` - full discussion of
2547 :func:`_orm.with_polymorphic`.
2548
2549 :param base: Base class to be aliased.
2550
2551 :param classes: a single class or mapper, or list of
2552 class/mappers, which inherit from the base class.
2553 Alternatively, it may also be the string ``'*'``, in which case
2554 all descending mapped classes will be added to the FROM clause.
2555
2556 :param aliased: when True, the selectable will be aliased. For a
2557 JOIN, this means the JOIN will be SELECTed from inside of a subquery
2558 unless the :paramref:`_orm.with_polymorphic.flat` flag is set to
2559 True, which is recommended for simpler use cases.
2560
2561 :param flat: Boolean, will be passed through to the
2562 :meth:`_expression.FromClause.alias` call so that aliases of
2563 :class:`_expression.Join` objects will alias the individual tables
2564 inside the join, rather than creating a subquery. This is generally
2565 supported by all modern databases with regards to right-nested joins
2566 and generally produces more efficient queries. Setting this flag is
2567 recommended as long as the resulting SQL is functional.
2568
2569 :param selectable: a table or subquery that will
2570 be used in place of the generated FROM clause. This argument is
2571 required if any of the desired classes use concrete table
2572 inheritance, since SQLAlchemy currently cannot generate UNIONs
2573 among tables automatically. If used, the ``selectable`` argument
2574 must represent the full set of tables and columns mapped by every
2575 mapped class. Otherwise, the unaccounted mapped columns will
2576 result in their table being appended directly to the FROM clause
2577 which will usually lead to incorrect results.
2578
2579 When left at its default value of ``False``, the polymorphic
2580 selectable assigned to the base mapper is used for selecting rows.
2581 However, it may also be passed as ``None``, which will bypass the
2582 configured polymorphic selectable and instead construct an ad-hoc
2583 selectable for the target classes given; for joined table inheritance
2584 this will be a join that includes all target mappers and their
2585 subclasses.
2586
2587 :param polymorphic_on: a column to be used as the "discriminator"
2588 column for the given selectable. If not given, the polymorphic_on
2589 attribute of the base classes' mapper will be used, if any. This
2590 is useful for mappings that don't have polymorphic loading
2591 behavior by default.
2592
2593 :param innerjoin: if True, an INNER JOIN will be used. This should
2594 only be specified if querying for one specific subtype only
2595
2596 :param adapt_on_names: Passes through the
2597 :paramref:`_orm.aliased.adapt_on_names`
2598 parameter to the aliased object. This may be useful in situations where
2599 the given selectable is not directly related to the existing mapped
2600 selectable.
2601
2602 .. versionadded:: 1.4.33
2603
2604 :param name: Name given to the generated :class:`.AliasedClass`.
2605
2606 .. versionadded:: 2.0.31
2607
2608 """
2609 return AliasedInsp._with_polymorphic_factory(
2610 base,
2611 classes,
2612 selectable=selectable,
2613 flat=flat,
2614 polymorphic_on=polymorphic_on,
2615 adapt_on_names=adapt_on_names,
2616 aliased=aliased,
2617 innerjoin=innerjoin,
2618 name=name,
2619 _use_mapper_path=_use_mapper_path,
2620 )
2621
2622
2623def join(
2624 left: _FromClauseArgument,
2625 right: _FromClauseArgument,
2626 onclause: Optional[_OnClauseArgument] = None,
2627 isouter: bool = False,
2628 full: bool = False,
2629) -> _ORMJoin:
2630 r"""Produce an inner join between left and right clauses.
2631
2632 :func:`_orm.join` is an extension to the core join interface
2633 provided by :func:`_expression.join()`, where the
2634 left and right selectable may be not only core selectable
2635 objects such as :class:`_schema.Table`, but also mapped classes or
2636 :class:`.AliasedClass` instances. The "on" clause can
2637 be a SQL expression or an ORM mapped attribute
2638 referencing a configured :func:`_orm.relationship`.
2639
2640 :func:`_orm.join` is not commonly needed in modern usage,
2641 as its functionality is encapsulated within that of the
2642 :meth:`_sql.Select.join` and :meth:`_query.Query.join`
2643 methods. which feature a
2644 significant amount of automation beyond :func:`_orm.join`
2645 by itself. Explicit use of :func:`_orm.join`
2646 with ORM-enabled SELECT statements involves use of the
2647 :meth:`_sql.Select.select_from` method, as in::
2648
2649 from sqlalchemy.orm import join
2650
2651 stmt = (
2652 select(User)
2653 .select_from(join(User, Address, User.addresses))
2654 .filter(Address.email_address == "foo@bar.com")
2655 )
2656
2657 In modern SQLAlchemy the above join can be written more
2658 succinctly as::
2659
2660 stmt = (
2661 select(User)
2662 .join(User.addresses)
2663 .filter(Address.email_address == "foo@bar.com")
2664 )
2665
2666 .. warning:: using :func:`_orm.join` directly may not work properly
2667 with modern ORM options such as :func:`_orm.with_loader_criteria`.
2668 It is strongly recommended to use the idiomatic join patterns
2669 provided by methods such as :meth:`.Select.join` and
2670 :meth:`.Select.join_from` when creating ORM joins.
2671
2672 .. seealso::
2673
2674 :ref:`orm_queryguide_joins` - in the :ref:`queryguide_toplevel` for
2675 background on idiomatic ORM join patterns
2676
2677 """
2678 return _ORMJoin(left, right, onclause, isouter, full)
2679
2680
2681def outerjoin(
2682 left: _FromClauseArgument,
2683 right: _FromClauseArgument,
2684 onclause: Optional[_OnClauseArgument] = None,
2685 full: bool = False,
2686) -> _ORMJoin:
2687 """Produce a left outer join between left and right clauses.
2688
2689 This is the "outer join" version of the :func:`_orm.join` function,
2690 featuring the same behavior except that an OUTER JOIN is generated.
2691 See that function's documentation for other usage details.
2692
2693 """
2694 return _ORMJoin(left, right, onclause, True, full)