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)