Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.11/site-packages/sqlalchemy/orm/_orm_constructors.py: 60%

Shortcuts on this page

r m x   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

129 statements  

1# orm/_orm_constructors.py 

2# Copyright (C) 2005-2026 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 column_template: Optional[str] = None, 

646 init: Union[_NoArg, bool] = _NoArg.NO_ARG, 

647 repr: Union[_NoArg, bool] = _NoArg.NO_ARG, # noqa: A002 

648 default: Optional[Any] = _NoArg.NO_ARG, 

649 default_factory: Union[_NoArg, Callable[[], _T]] = _NoArg.NO_ARG, 

650 compare: Union[_NoArg, bool] = _NoArg.NO_ARG, 

651 kw_only: Union[_NoArg, bool] = _NoArg.NO_ARG, 

652 hash: Union[_NoArg, bool, None] = _NoArg.NO_ARG, # noqa: A002 

653 info: Optional[_InfoType] = None, 

654 doc: Optional[str] = None, 

655 dataclass_metadata: Union[_NoArg, Mapping[Any, Any], None] = _NoArg.NO_ARG, 

656 **__kw: Any, 

657) -> Composite[Any]: ... 

658 

659 

660@overload 

661def composite( 

662 _class_or_attr: Type[_CC], 

663 /, 

664 *attrs: _CompositeAttrType[Any], 

665 group: Optional[str] = None, 

666 deferred: bool = False, 

667 raiseload: bool = False, 

668 return_none_on: Union[_NoArg, None, Callable[..., bool]] = _NoArg.NO_ARG, 

669 comparator_factory: Optional[Type[Composite.Comparator[_T]]] = None, 

670 active_history: bool = False, 

671 column_template: Optional[str] = None, 

672 init: Union[_NoArg, bool] = _NoArg.NO_ARG, 

673 repr: Union[_NoArg, bool] = _NoArg.NO_ARG, # noqa: A002 

674 default: Optional[Any] = _NoArg.NO_ARG, 

675 default_factory: Union[_NoArg, Callable[[], _T]] = _NoArg.NO_ARG, 

676 compare: Union[_NoArg, bool] = _NoArg.NO_ARG, 

677 kw_only: Union[_NoArg, bool] = _NoArg.NO_ARG, 

678 hash: Union[_NoArg, bool, None] = _NoArg.NO_ARG, # noqa: A002 

679 info: Optional[_InfoType] = None, 

680 doc: Optional[str] = None, 

681 **__kw: Any, 

682) -> Composite[_CC]: ... 

683 

684 

685@overload 

686def composite( 

687 _class_or_attr: Callable[..., _CC], 

688 /, 

689 *attrs: _CompositeAttrType[Any], 

690 group: Optional[str] = None, 

691 deferred: bool = False, 

692 raiseload: bool = False, 

693 return_none_on: Union[_NoArg, None, Callable[..., bool]] = _NoArg.NO_ARG, 

694 comparator_factory: Optional[Type[Composite.Comparator[_T]]] = None, 

695 active_history: bool = False, 

696 column_template: Optional[str] = None, 

697 init: Union[_NoArg, bool] = _NoArg.NO_ARG, 

698 repr: Union[_NoArg, bool] = _NoArg.NO_ARG, # noqa: A002 

699 default: Optional[Any] = _NoArg.NO_ARG, 

700 default_factory: Union[_NoArg, Callable[[], _T]] = _NoArg.NO_ARG, 

701 compare: Union[_NoArg, bool] = _NoArg.NO_ARG, 

702 kw_only: Union[_NoArg, bool] = _NoArg.NO_ARG, 

703 hash: Union[_NoArg, bool, None] = _NoArg.NO_ARG, # noqa: A002 

704 info: Optional[_InfoType] = None, 

705 doc: Optional[str] = None, 

706 **__kw: Any, 

707) -> Composite[_CC]: ... 

708 

709 

710def composite( 

711 _class_or_attr: Union[ 

712 None, Type[_CC], Callable[..., _CC], _CompositeAttrType[Any] 

713 ] = None, 

714 /, 

715 *attrs: _CompositeAttrType[Any], 

716 group: Optional[str] = None, 

717 deferred: bool = False, 

718 raiseload: bool = False, 

719 return_none_on: Union[_NoArg, None, Callable[..., bool]] = _NoArg.NO_ARG, 

720 comparator_factory: Optional[Type[Composite.Comparator[_T]]] = None, 

721 active_history: bool = False, 

722 column_template: Optional[str] = None, 

723 init: Union[_NoArg, bool] = _NoArg.NO_ARG, 

724 repr: Union[_NoArg, bool] = _NoArg.NO_ARG, # noqa: A002 

725 default: Optional[Any] = _NoArg.NO_ARG, 

726 default_factory: Union[_NoArg, Callable[[], _T]] = _NoArg.NO_ARG, 

727 compare: Union[_NoArg, bool] = _NoArg.NO_ARG, 

728 kw_only: Union[_NoArg, bool] = _NoArg.NO_ARG, 

729 hash: Union[_NoArg, bool, None] = _NoArg.NO_ARG, # noqa: A002 

730 info: Optional[_InfoType] = None, 

731 doc: Optional[str] = None, 

732 dataclass_metadata: Union[_NoArg, Mapping[Any, Any], None] = _NoArg.NO_ARG, 

733 **__kw: Any, 

734) -> Composite[Any]: 

735 r"""Return a composite column-based property for use with a Mapper. 

736 

737 See the mapping documentation section :ref:`mapper_composite` for a 

738 full usage example. 

739 

740 The :class:`.MapperProperty` returned by :func:`.composite` 

741 is the :class:`.Composite`. 

742 

743 :param class\_: 

744 The "composite type" class, or any classmethod or callable which 

745 will produce a new instance of the composite object given the 

746 column values in order. 

747 

748 :param \*attrs: 

749 List of elements to be mapped, which may include: 

750 

751 * :class:`_schema.Column` objects 

752 * :func:`_orm.mapped_column` constructs 

753 * string names of other attributes on the mapped class, which may be 

754 any other SQL or object-mapped attribute. This can for 

755 example allow a composite that refers to a many-to-one relationship 

756 

757 :param active_history=False: 

758 When ``True``, indicates that the "previous" value for a 

759 scalar attribute should be loaded when replaced, if not 

760 already loaded. See the same flag on :func:`.column_property`. 

761 

762 :param return_none_on=None: A callable that will be evaluated when the 

763 composite object is to be constructed, which upon returning the boolean 

764 value ``True`` will instead bypass the construction and cause the 

765 resulting value to be None. This typically may be assigned a lambda 

766 that will evaluate to True when all the columns within the composite 

767 are themselves None, e.g.:: 

768 

769 composite( 

770 MyComposite, return_none_on=lambda *cols: all(x is None for x in cols) 

771 ) 

772 

773 The above lambda for :paramref:`.composite.return_none_on` is used 

774 automatically when using ORM Annotated Declarative along with an optional 

775 value within the :class:`.Mapped` annotation. 

776 

777 .. versionadded:: 2.1 

778 

779 :param group: 

780 A group name for this property when marked as deferred. 

781 

782 :param deferred: 

783 When True, the column property is "deferred", meaning that it does 

784 not load immediately, and is instead loaded when the attribute is 

785 first accessed on an instance. See also 

786 :func:`~sqlalchemy.orm.deferred`. 

787 

788 :param comparator_factory: a class which extends 

789 :class:`.Composite.Comparator` which provides custom SQL 

790 clause generation for comparison operations. 

791 

792 :param column_template: A string template such as ``"person_%s"``, 

793 containing exactly one ``%s`` placeholder, that's used to generate 

794 column names for fields of a dataclass :paramref:`.composite.class_` 

795 that don't otherwise have an explicit name. Only supported for 

796 dataclass-based composite classes. 

797 

798 .. seealso:: 

799 

800 :ref:`composite_column_template` 

801 

802 .. versionadded:: 2.1 

803 

804 :param doc: 

805 optional string that will be applied as the doc on the 

806 class-bound descriptor. 

807 

808 :param info: Optional data dictionary which will be populated into the 

809 :attr:`.MapperProperty.info` attribute of this object. 

810 

811 :param init: Specific to :ref:`orm_declarative_native_dataclasses`, 

812 specifies if the mapped attribute should be part of the ``__init__()`` 

813 method as generated by the dataclass process. 

814 :param repr: Specific to :ref:`orm_declarative_native_dataclasses`, 

815 specifies if the mapped attribute should be part of the ``__repr__()`` 

816 method as generated by the dataclass process. 

817 :param default_factory: Specific to 

818 :ref:`orm_declarative_native_dataclasses`, 

819 specifies a default-value generation function that will take place 

820 as part of the ``__init__()`` 

821 method as generated by the dataclass process. 

822 

823 :param compare: Specific to 

824 :ref:`orm_declarative_native_dataclasses`, indicates if this field 

825 should be included in comparison operations when generating the 

826 ``__eq__()`` and ``__ne__()`` methods for the mapped class. 

827 

828 .. versionadded:: 2.0.0b4 

829 

830 :param kw_only: Specific to 

831 :ref:`orm_declarative_native_dataclasses`, indicates if this field 

832 should be marked as keyword-only when generating the ``__init__()``. 

833 

834 :param hash: Specific to 

835 :ref:`orm_declarative_native_dataclasses`, controls if this field 

836 is included when generating the ``__hash__()`` method for the mapped 

837 class. 

838 

839 .. versionadded:: 2.0.36 

840 

841 :param dataclass_metadata: Specific to 

842 :ref:`orm_declarative_native_dataclasses`, supplies metadata 

843 to be attached to the generated dataclass field. 

844 

845 .. versionadded:: 2.0.42 

846 

847 """ # noqa: E501 

848 

849 if __kw: 

850 raise _no_kw() 

851 

852 return Composite( 

853 _class_or_attr, 

854 *attrs, 

855 return_none_on=return_none_on, 

856 attribute_options=_AttributeOptions( 

857 init, 

858 repr, 

859 default, 

860 default_factory, 

861 compare, 

862 kw_only, 

863 hash, 

864 dataclass_metadata, 

865 ), 

866 group=group, 

867 deferred=deferred, 

868 raiseload=raiseload, 

869 comparator_factory=comparator_factory, 

870 active_history=active_history, 

871 column_template=column_template, 

872 info=info, 

873 doc=doc, 

874 ) 

875 

876 

877def with_loader_criteria( 

878 entity_or_base: _EntityType[Any], 

879 where_criteria: Union[ 

880 _ColumnExpressionArgument[bool], 

881 Callable[[Any], _ColumnExpressionArgument[bool]], 

882 ], 

883 loader_only: bool = False, 

884 include_aliases: bool = False, 

885 propagate_to_loaders: bool = True, 

886 track_closure_variables: bool = True, 

887) -> LoaderCriteriaOption: 

888 """Add additional WHERE criteria to the load for all occurrences of 

889 a particular entity. 

890 

891 .. versionadded:: 1.4 

892 

893 The :func:`_orm.with_loader_criteria` option is intended to add 

894 limiting criteria to a particular kind of entity in a query, 

895 **globally**, meaning it will apply to the entity as it appears 

896 in the SELECT query as well as within any subqueries, join 

897 conditions, and relationship loads, including both eager and lazy 

898 loaders, without the need for it to be specified in any particular 

899 part of the query. The rendering logic uses the same system used by 

900 single table inheritance to ensure a certain discriminator is applied 

901 to a table. 

902 

903 E.g., using :term:`2.0-style` queries, we can limit the way the 

904 ``User.addresses`` collection is loaded, regardless of the kind 

905 of loading used:: 

906 

907 from sqlalchemy.orm import with_loader_criteria 

908 

909 stmt = select(User).options( 

910 selectinload(User.addresses), 

911 with_loader_criteria(Address, Address.email_address != "foo"), 

912 ) 

913 

914 Above, the "selectinload" for ``User.addresses`` will apply the 

915 given filtering criteria to the WHERE clause. 

916 

917 Another example, where the filtering will be applied to the 

918 ON clause of the join, in this example using :term:`1.x style` 

919 queries:: 

920 

921 q = ( 

922 session.query(User) 

923 .outerjoin(User.addresses) 

924 .options(with_loader_criteria(Address, Address.email_address != "foo")) 

925 ) 

926 

927 The primary purpose of :func:`_orm.with_loader_criteria` is to use 

928 it in the :meth:`_orm.SessionEvents.do_orm_execute` event handler 

929 to ensure that all occurrences of a particular entity are filtered 

930 in a certain way, such as filtering for access control roles. It 

931 also can be used to apply criteria to relationship loads. In the 

932 example below, we can apply a certain set of rules to all queries 

933 emitted by a particular :class:`_orm.Session`:: 

934 

935 session = Session(bind=engine) 

936 

937 

938 @event.listens_for("do_orm_execute", session) 

939 def _add_filtering_criteria(execute_state): 

940 

941 if ( 

942 execute_state.is_select 

943 and not execute_state.is_column_load 

944 and not execute_state.is_relationship_load 

945 ): 

946 execute_state.statement = execute_state.statement.options( 

947 with_loader_criteria( 

948 SecurityRole, 

949 lambda cls: cls.role.in_(["some_role"]), 

950 include_aliases=True, 

951 ) 

952 ) 

953 

954 In the above example, the :meth:`_orm.SessionEvents.do_orm_execute` 

955 event will intercept all queries emitted using the 

956 :class:`_orm.Session`. For those queries which are SELECT statements 

957 and are not attribute or relationship loads a custom 

958 :func:`_orm.with_loader_criteria` option is added to the query. The 

959 :func:`_orm.with_loader_criteria` option will be used in the given 

960 statement and will also be automatically propagated to all relationship 

961 loads that descend from this query. 

962 

963 The criteria argument given is a ``lambda`` that accepts a ``cls`` 

964 argument. The given class will expand to include all mapped subclass 

965 and need not itself be a mapped class. 

966 

967 .. tip:: 

968 

969 When using :func:`_orm.with_loader_criteria` option in 

970 conjunction with the :func:`_orm.contains_eager` loader option, 

971 it's important to note that :func:`_orm.with_loader_criteria` only 

972 affects the part of the query that determines what SQL is rendered 

973 in terms of the WHERE and FROM clauses. The 

974 :func:`_orm.contains_eager` option does not affect the rendering of 

975 the SELECT statement outside of the columns clause, so does not have 

976 any interaction with the :func:`_orm.with_loader_criteria` option. 

977 However, the way things "work" is that :func:`_orm.contains_eager` 

978 is meant to be used with a query that is already selecting from the 

979 additional entities in some way, where 

980 :func:`_orm.with_loader_criteria` can apply it's additional 

981 criteria. 

982 

983 In the example below, assuming a mapping relationship as 

984 ``A -> A.bs -> B``, the given :func:`_orm.with_loader_criteria` 

985 option will affect the way in which the JOIN is rendered:: 

986 

987 stmt = ( 

988 select(A) 

989 .join(A.bs) 

990 .options(contains_eager(A.bs), with_loader_criteria(B, B.flag == 1)) 

991 ) 

992 

993 Above, the given :func:`_orm.with_loader_criteria` option will 

994 affect the ON clause of the JOIN that is specified by 

995 ``.join(A.bs)``, so is applied as expected. The 

996 :func:`_orm.contains_eager` option has the effect that columns from 

997 ``B`` are added to the columns clause: 

998 

999 .. sourcecode:: sql 

1000 

1001 SELECT 

1002 b.id, b.a_id, b.data, b.flag, 

1003 a.id AS id_1, 

1004 a.data AS data_1 

1005 FROM a JOIN b ON a.id = b.a_id AND b.flag = :flag_1 

1006 

1007 

1008 The use of the :func:`_orm.contains_eager` option within the above 

1009 statement has no effect on the behavior of the 

1010 :func:`_orm.with_loader_criteria` option. If the 

1011 :func:`_orm.contains_eager` option were omitted, the SQL would be 

1012 the same as regards the FROM and WHERE clauses, where 

1013 :func:`_orm.with_loader_criteria` continues to add its criteria to 

1014 the ON clause of the JOIN. The addition of 

1015 :func:`_orm.contains_eager` only affects the columns clause, in that 

1016 additional columns against ``b`` are added which are then consumed 

1017 by the ORM to produce ``B`` instances. 

1018 

1019 .. warning:: The use of a lambda inside of the call to 

1020 :func:`_orm.with_loader_criteria` is only invoked **once per unique 

1021 class**. Custom functions should not be invoked within this lambda. 

1022 See :ref:`engine_lambda_caching` for an overview of the "lambda SQL" 

1023 feature, which is for advanced use only. 

1024 

1025 :param entity_or_base: a mapped class, or a class that is a super 

1026 class of a particular set of mapped classes, to which the rule 

1027 will apply. 

1028 

1029 :param where_criteria: a Core SQL expression that applies limiting 

1030 criteria. This may also be a "lambda:" or Python function that 

1031 accepts a target class as an argument, when the given class is 

1032 a base with many different mapped subclasses. 

1033 

1034 .. note:: To support pickling, use a module-level Python function to 

1035 produce the SQL expression instead of a lambda or a fixed SQL 

1036 expression, which tend to not be picklable. 

1037 

1038 :param include_aliases: if True, apply the rule to :func:`_orm.aliased` 

1039 constructs as well. 

1040 

1041 :param propagate_to_loaders: defaults to True, apply to relationship 

1042 loaders such as lazy loaders. This indicates that the 

1043 option object itself including SQL expression is carried along with 

1044 each loaded instance. Set to ``False`` to prevent the object from 

1045 being assigned to individual instances. 

1046 

1047 

1048 .. seealso:: 

1049 

1050 :ref:`examples_session_orm_events` - includes examples of using 

1051 :func:`_orm.with_loader_criteria`. 

1052 

1053 :ref:`do_orm_execute_global_criteria` - basic example on how to 

1054 combine :func:`_orm.with_loader_criteria` with the 

1055 :meth:`_orm.SessionEvents.do_orm_execute` event. 

1056 

1057 :param track_closure_variables: when False, closure variables inside 

1058 of a lambda expression will not be used as part of 

1059 any cache key. This allows more complex expressions to be used 

1060 inside of a lambda expression but requires that the lambda ensures 

1061 it returns the identical SQL every time given a particular class. 

1062 

1063 .. versionadded:: 1.4.0b2 

1064 

1065 """ # noqa: E501 

1066 return LoaderCriteriaOption( 

1067 entity_or_base, 

1068 where_criteria, 

1069 loader_only, 

1070 include_aliases, 

1071 propagate_to_loaders, 

1072 track_closure_variables, 

1073 ) 

1074 

1075 

1076def relationship( 

1077 argument: Optional[_RelationshipArgumentType[Any]] = None, 

1078 secondary: Optional[_RelationshipSecondaryArgument] = None, 

1079 *, 

1080 uselist: Optional[bool] = None, 

1081 collection_class: Optional[ 

1082 Union[Type[Collection[Any]], Callable[[], Collection[Any]]] 

1083 ] = None, 

1084 primaryjoin: Optional[_RelationshipJoinConditionArgument] = None, 

1085 secondaryjoin: Optional[_RelationshipJoinConditionArgument] = None, 

1086 back_populates: Optional[_RelationshipBackPopulatesArgument] = None, 

1087 order_by: _ORMOrderByArgument = False, 

1088 backref: Optional[ORMBackrefArgument] = None, 

1089 overlaps: Optional[str] = None, 

1090 post_update: bool = False, 

1091 cascade: str = "save-update, merge", 

1092 viewonly: bool = False, 

1093 init: Union[_NoArg, bool] = _NoArg.NO_ARG, 

1094 repr: Union[_NoArg, bool] = _NoArg.NO_ARG, # noqa: A002 

1095 default: Union[_NoArg, _T] = _NoArg.NO_ARG, 

1096 default_factory: Union[_NoArg, Callable[[], _T]] = _NoArg.NO_ARG, 

1097 compare: Union[_NoArg, bool] = _NoArg.NO_ARG, 

1098 kw_only: Union[_NoArg, bool] = _NoArg.NO_ARG, 

1099 hash: Union[_NoArg, bool, None] = _NoArg.NO_ARG, # noqa: A002 

1100 lazy: _LazyLoadArgumentType = "select", 

1101 passive_deletes: Union[Literal["all"], bool] = False, 

1102 passive_updates: bool = True, 

1103 active_history: bool = False, 

1104 enable_typechecks: bool = True, 

1105 foreign_keys: Optional[_ORMColCollectionArgument] = None, 

1106 remote_side: Optional[_ORMColCollectionArgument] = None, 

1107 join_depth: Optional[int] = None, 

1108 comparator_factory: Optional[ 

1109 Type[RelationshipProperty.Comparator[Any]] 

1110 ] = None, 

1111 single_parent: bool = False, 

1112 innerjoin: bool = False, 

1113 distinct_target_key: Optional[bool] = None, 

1114 load_on_pending: bool = False, 

1115 query_class: Optional[Type[Query[Any]]] = None, 

1116 info: Optional[_InfoType] = None, 

1117 omit_join: Literal[None, False] = None, 

1118 sync_backref: Optional[bool] = None, 

1119 dataclass_metadata: Union[_NoArg, Mapping[Any, Any], None] = _NoArg.NO_ARG, 

1120 **kw: Any, 

1121) -> _RelationshipDeclared[Any]: 

1122 """Provide a relationship between two mapped classes. 

1123 

1124 This corresponds to a parent-child or associative table relationship. 

1125 The constructed class is an instance of :class:`.Relationship`. 

1126 

1127 .. seealso:: 

1128 

1129 :ref:`tutorial_orm_related_objects` - tutorial introduction 

1130 to :func:`_orm.relationship` in the :ref:`unified_tutorial` 

1131 

1132 :ref:`relationship_config_toplevel` - narrative documentation 

1133 

1134 :param argument: 

1135 This parameter refers to the class that is to be related. It 

1136 accepts several forms, including a direct reference to the target 

1137 class itself, the :class:`_orm.Mapper` instance for the target class, 

1138 a Python callable / lambda that will return a reference to the 

1139 class or :class:`_orm.Mapper` when called, and finally a string 

1140 name for the class, which will be resolved from the 

1141 :class:`_orm.registry` in use in order to locate the class, e.g.:: 

1142 

1143 class SomeClass(Base): 

1144 # ... 

1145 

1146 related = relationship("RelatedClass") 

1147 

1148 The :paramref:`_orm.relationship.argument` may also be omitted from the 

1149 :func:`_orm.relationship` construct entirely, and instead placed inside 

1150 a :class:`_orm.Mapped` annotation on the left side, which should 

1151 include a Python collection type if the relationship is expected 

1152 to be a collection, such as:: 

1153 

1154 class SomeClass(Base): 

1155 # ... 

1156 

1157 related_items: Mapped[List["RelatedItem"]] = relationship() 

1158 

1159 Or for a many-to-one or one-to-one relationship:: 

1160 

1161 class SomeClass(Base): 

1162 # ... 

1163 

1164 related_item: Mapped["RelatedItem"] = relationship() 

1165 

1166 .. seealso:: 

1167 

1168 :ref:`orm_declarative_properties` - further detail 

1169 on relationship configuration when using Declarative. 

1170 

1171 :param secondary: 

1172 For a many-to-many relationship, specifies the intermediary 

1173 table, and is typically an instance of :class:`_schema.Table`. 

1174 In less common circumstances, the argument may also be specified 

1175 as an :class:`_expression.Alias` construct, or even a 

1176 :class:`_expression.Join` construct. 

1177 

1178 :paramref:`_orm.relationship.secondary` may 

1179 also be passed as a callable function which is evaluated at 

1180 mapper initialization time. When using Declarative, it may also 

1181 be a string argument noting the name of a :class:`_schema.Table` 

1182 that is 

1183 present in the :class:`_schema.MetaData` 

1184 collection associated with the 

1185 parent-mapped :class:`_schema.Table`. 

1186 

1187 .. versionchanged:: 2.1 When passed as a string, the argument is 

1188 interpreted as a string name that should exist directly in the 

1189 registry of tables. The Python ``eval()`` function is no longer 

1190 used for the :paramref:`_orm.relationship.secondary` argument when 

1191 passed as a string. 

1192 

1193 The :paramref:`_orm.relationship.secondary` keyword argument is 

1194 typically applied in the case where the intermediary 

1195 :class:`_schema.Table` 

1196 is not otherwise expressed in any direct class mapping. If the 

1197 "secondary" table is also explicitly mapped elsewhere (e.g. as in 

1198 :ref:`association_pattern`), one should consider applying the 

1199 :paramref:`_orm.relationship.viewonly` flag so that this 

1200 :func:`_orm.relationship` 

1201 is not used for persistence operations which 

1202 may conflict with those of the association object pattern. 

1203 

1204 .. seealso:: 

1205 

1206 :ref:`relationships_many_to_many` - Reference example of "many 

1207 to many". 

1208 

1209 :ref:`self_referential_many_to_many` - Specifics on using 

1210 many-to-many in a self-referential case. 

1211 

1212 :ref:`declarative_many_to_many` - Additional options when using 

1213 Declarative. 

1214 

1215 :ref:`association_pattern` - an alternative to 

1216 :paramref:`_orm.relationship.secondary` 

1217 when composing association 

1218 table relationships, allowing additional attributes to be 

1219 specified on the association table. 

1220 

1221 :ref:`composite_secondary_join` - a lesser-used pattern which 

1222 in some cases can enable complex :func:`_orm.relationship` SQL 

1223 conditions to be used. 

1224 

1225 :param active_history=False: 

1226 When ``True``, indicates that the "previous" value for a 

1227 many-to-one reference should be loaded when replaced, if 

1228 not already loaded. Normally, history tracking logic for 

1229 simple many-to-ones only needs to be aware of the "new" 

1230 value in order to perform a flush. This flag is available 

1231 for applications that make use of 

1232 :func:`.attributes.get_history` which also need to know 

1233 the "previous" value of the attribute. 

1234 

1235 :param backref: 

1236 A reference to a string relationship name, or a :func:`_orm.backref` 

1237 construct, which will be used to automatically generate a new 

1238 :func:`_orm.relationship` on the related class, which then refers to this 

1239 one using a bi-directional :paramref:`_orm.relationship.back_populates` 

1240 configuration. 

1241 

1242 In modern Python, explicit use of :func:`_orm.relationship` 

1243 with :paramref:`_orm.relationship.back_populates` should be preferred, 

1244 as it is more robust in terms of mapper configuration as well as 

1245 more conceptually straightforward. It also integrates with 

1246 new :pep:`484` typing features introduced in SQLAlchemy 2.0 which 

1247 is not possible with dynamically generated attributes. 

1248 

1249 .. seealso:: 

1250 

1251 :ref:`relationships_backref` - notes on using 

1252 :paramref:`_orm.relationship.backref` 

1253 

1254 :ref:`tutorial_orm_related_objects` - in the :ref:`unified_tutorial`, 

1255 presents an overview of bi-directional relationship configuration 

1256 and behaviors using :paramref:`_orm.relationship.back_populates` 

1257 

1258 :func:`.backref` - allows control over :func:`_orm.relationship` 

1259 configuration when using :paramref:`_orm.relationship.backref`. 

1260 

1261 

1262 :param back_populates: 

1263 Indicates the name of a :func:`_orm.relationship` on the related 

1264 class that will be synchronized with this one. It is usually 

1265 expected that the :func:`_orm.relationship` on the related class 

1266 also refer to this one. This allows objects on both sides of 

1267 each :func:`_orm.relationship` to synchronize in-Python state 

1268 changes and also provides directives to the :term:`unit of work` 

1269 flush process how changes along these relationships should 

1270 be persisted. 

1271 

1272 .. seealso:: 

1273 

1274 :ref:`tutorial_orm_related_objects` - in the :ref:`unified_tutorial`, 

1275 presents an overview of bi-directional relationship configuration 

1276 and behaviors. 

1277 

1278 :ref:`relationship_patterns` - includes many examples of 

1279 :paramref:`_orm.relationship.back_populates`. 

1280 

1281 :paramref:`_orm.relationship.backref` - legacy form which allows 

1282 more succinct configuration, but does not support explicit typing 

1283 

1284 :param overlaps: 

1285 A string name or comma-delimited set of names of other relationships 

1286 on either this mapper, a descendant mapper, or a target mapper with 

1287 which this relationship may write to the same foreign keys upon 

1288 persistence. The only effect this has is to eliminate the 

1289 warning that this relationship will conflict with another upon 

1290 persistence. This is used for such relationships that are truly 

1291 capable of conflicting with each other on write, but the application 

1292 will ensure that no such conflicts occur. 

1293 

1294 .. versionadded:: 1.4 

1295 

1296 .. seealso:: 

1297 

1298 :ref:`error_qzyx` - usage example 

1299 

1300 :param cascade: 

1301 A comma-separated list of cascade rules which determines how 

1302 Session operations should be "cascaded" from parent to child. 

1303 This defaults to ``False``, which means the default cascade 

1304 should be used - this default cascade is ``"save-update, merge"``. 

1305 

1306 The available cascades are ``save-update``, ``merge``, 

1307 ``expunge``, ``delete``, ``delete-orphan``, and ``refresh-expire``. 

1308 An additional option, ``all`` indicates shorthand for 

1309 ``"save-update, merge, refresh-expire, 

1310 expunge, delete"``, and is often used as in ``"all, delete-orphan"`` 

1311 to indicate that related objects should follow along with the 

1312 parent object in all cases, and be deleted when de-associated. 

1313 

1314 .. seealso:: 

1315 

1316 :ref:`unitofwork_cascades` - Full detail on each of the available 

1317 cascade options. 

1318 

1319 :param cascade_backrefs=False: 

1320 Legacy; this flag is always False. 

1321 

1322 .. versionchanged:: 2.0 "cascade_backrefs" functionality has been 

1323 removed. 

1324 

1325 :param collection_class: 

1326 A class or callable that returns a new list-holding object. will 

1327 be used in place of a plain list for storing elements. 

1328 

1329 .. seealso:: 

1330 

1331 :ref:`custom_collections` - Introductory documentation and 

1332 examples. 

1333 

1334 :param comparator_factory: 

1335 A class which extends :class:`.Relationship.Comparator` 

1336 which provides custom SQL clause generation for comparison 

1337 operations. 

1338 

1339 .. seealso:: 

1340 

1341 :class:`.PropComparator` - some detail on redefining comparators 

1342 at this level. 

1343 

1344 :ref:`custom_comparators` - Brief intro to this feature. 

1345 

1346 

1347 :param distinct_target_key=None: 

1348 Indicate if a "subquery" eager load should apply the DISTINCT 

1349 keyword to the innermost SELECT statement. When left as ``None``, 

1350 the DISTINCT keyword will be applied in those cases when the target 

1351 columns do not comprise the full primary key of the target table. 

1352 When set to ``True``, the DISTINCT keyword is applied to the 

1353 innermost SELECT unconditionally. 

1354 

1355 It may be desirable to set this flag to False when the DISTINCT is 

1356 reducing performance of the innermost subquery beyond that of what 

1357 duplicate innermost rows may be causing. 

1358 

1359 .. seealso:: 

1360 

1361 :ref:`loading_toplevel` - includes an introduction to subquery 

1362 eager loading. 

1363 

1364 :param doc: 

1365 Docstring which will be applied to the resulting descriptor. 

1366 

1367 :param foreign_keys: 

1368 

1369 A list of columns which are to be used as "foreign key" 

1370 columns, or columns which refer to the value in a remote 

1371 column, within the context of this :func:`_orm.relationship` 

1372 object's :paramref:`_orm.relationship.primaryjoin` condition. 

1373 That is, if the :paramref:`_orm.relationship.primaryjoin` 

1374 condition of this :func:`_orm.relationship` is ``a.id == 

1375 b.a_id``, and the values in ``b.a_id`` are required to be 

1376 present in ``a.id``, then the "foreign key" column of this 

1377 :func:`_orm.relationship` is ``b.a_id``. 

1378 

1379 In normal cases, the :paramref:`_orm.relationship.foreign_keys` 

1380 parameter is **not required.** :func:`_orm.relationship` will 

1381 automatically determine which columns in the 

1382 :paramref:`_orm.relationship.primaryjoin` condition are to be 

1383 considered "foreign key" columns based on those 

1384 :class:`_schema.Column` objects that specify 

1385 :class:`_schema.ForeignKey`, 

1386 or are otherwise listed as referencing columns in a 

1387 :class:`_schema.ForeignKeyConstraint` construct. 

1388 :paramref:`_orm.relationship.foreign_keys` is only needed when: 

1389 

1390 1. There is more than one way to construct a join from the local 

1391 table to the remote table, as there are multiple foreign key 

1392 references present. Setting ``foreign_keys`` will limit the 

1393 :func:`_orm.relationship` 

1394 to consider just those columns specified 

1395 here as "foreign". 

1396 

1397 2. The :class:`_schema.Table` being mapped does not actually have 

1398 :class:`_schema.ForeignKey` or 

1399 :class:`_schema.ForeignKeyConstraint` 

1400 constructs present, often because the table 

1401 was reflected from a database that does not support foreign key 

1402 reflection (MySQL MyISAM). 

1403 

1404 3. The :paramref:`_orm.relationship.primaryjoin` 

1405 argument is used to 

1406 construct a non-standard join condition, which makes use of 

1407 columns or expressions that do not normally refer to their 

1408 "parent" column, such as a join condition expressed by a 

1409 complex comparison using a SQL function. 

1410 

1411 The :func:`_orm.relationship` construct will raise informative 

1412 error messages that suggest the use of the 

1413 :paramref:`_orm.relationship.foreign_keys` parameter when 

1414 presented with an ambiguous condition. In typical cases, 

1415 if :func:`_orm.relationship` doesn't raise any exceptions, the 

1416 :paramref:`_orm.relationship.foreign_keys` parameter is usually 

1417 not needed. 

1418 

1419 :paramref:`_orm.relationship.foreign_keys` may also be passed as a 

1420 callable function which is evaluated at mapper initialization time, 

1421 and may be passed as a Python-evaluable string when using 

1422 Declarative. 

1423 

1424 .. warning:: When passed as a Python-evaluable string, the 

1425 argument is interpreted using Python's ``eval()`` function. 

1426 **DO NOT PASS UNTRUSTED INPUT TO THIS STRING**. 

1427 See :ref:`declarative_relationship_eval` for details on 

1428 declarative evaluation of :func:`_orm.relationship` arguments. 

1429 

1430 .. seealso:: 

1431 

1432 :ref:`relationship_foreign_keys` 

1433 

1434 :ref:`relationship_custom_foreign` 

1435 

1436 :func:`.foreign` - allows direct annotation of the "foreign" 

1437 columns within a :paramref:`_orm.relationship.primaryjoin` 

1438 condition. 

1439 

1440 :param info: Optional data dictionary which will be populated into the 

1441 :attr:`.MapperProperty.info` attribute of this object. 

1442 

1443 :param innerjoin=False: 

1444 When ``True``, joined eager loads will use an inner join to join 

1445 against related tables instead of an outer join. The purpose 

1446 of this option is generally one of performance, as inner joins 

1447 generally perform better than outer joins. 

1448 

1449 This flag can be set to ``True`` when the relationship references an 

1450 object via many-to-one using local foreign keys that are not 

1451 nullable, or when the reference is one-to-one or a collection that 

1452 is guaranteed to have one or at least one entry. 

1453 

1454 The option supports the same "nested" and "unnested" options as 

1455 that of :paramref:`_orm.joinedload.innerjoin`. See that flag 

1456 for details on nested / unnested behaviors. 

1457 

1458 .. seealso:: 

1459 

1460 :paramref:`_orm.joinedload.innerjoin` - the option as specified by 

1461 loader option, including detail on nesting behavior. 

1462 

1463 :ref:`what_kind_of_loading` - Discussion of some details of 

1464 various loader options. 

1465 

1466 

1467 :param join_depth: 

1468 When non-``None``, an integer value indicating how many levels 

1469 deep "eager" loaders should join on a self-referring or cyclical 

1470 relationship. The number counts how many times the same Mapper 

1471 shall be present in the loading condition along a particular join 

1472 branch. When left at its default of ``None``, eager loaders 

1473 will stop chaining when they encounter a the same target mapper 

1474 which is already higher up in the chain. This option applies 

1475 both to joined- and subquery- eager loaders. 

1476 

1477 .. seealso:: 

1478 

1479 :ref:`self_referential_eager_loading` - Introductory documentation 

1480 and examples. 

1481 

1482 :param lazy='select': specifies 

1483 How the related items should be loaded. Default value is 

1484 ``select``. Values include: 

1485 

1486 * ``select`` - items should be loaded lazily when the property is 

1487 first accessed, using a separate SELECT statement, or identity map 

1488 fetch for simple many-to-one references. 

1489 

1490 * ``immediate`` - items should be loaded as the parents are loaded, 

1491 using a separate SELECT statement, or identity map fetch for 

1492 simple many-to-one references. 

1493 

1494 * ``joined`` - items should be loaded "eagerly" in the same query as 

1495 that of the parent, using a JOIN or LEFT OUTER JOIN. Whether 

1496 the join is "outer" or not is determined by the 

1497 :paramref:`_orm.relationship.innerjoin` parameter. 

1498 

1499 * ``subquery`` - items should be loaded "eagerly" as the parents are 

1500 loaded, using one additional SQL statement, which issues a JOIN to 

1501 a subquery of the original statement, for each collection 

1502 requested. 

1503 

1504 * ``selectin`` - items should be loaded "eagerly" as the parents 

1505 are loaded, using one or more additional SQL statements, which 

1506 issues a JOIN to the immediate parent object, specifying primary 

1507 key identifiers using an IN clause. 

1508 

1509 * ``raise`` - lazy loading is disallowed; accessing 

1510 the attribute, if its value were not already loaded via eager 

1511 loading, will raise an :exc:`~sqlalchemy.exc.InvalidRequestError`. 

1512 This strategy can be used when objects are to be detached from 

1513 their attached :class:`.Session` after they are loaded. 

1514 

1515 * ``raise_on_sql`` - lazy loading that emits SQL is disallowed; 

1516 accessing the attribute, if its value were not already loaded via 

1517 eager loading, will raise an 

1518 :exc:`~sqlalchemy.exc.InvalidRequestError`, **if the lazy load 

1519 needs to emit SQL**. If the lazy load can pull the related value 

1520 from the identity map or determine that it should be None, the 

1521 value is loaded. This strategy can be used when objects will 

1522 remain associated with the attached :class:`.Session`, however 

1523 additional SELECT statements should be blocked. 

1524 

1525 * ``write_only`` - the attribute will be configured with a special 

1526 "virtual collection" that may receive 

1527 :meth:`_orm.WriteOnlyCollection.add` and 

1528 :meth:`_orm.WriteOnlyCollection.remove` commands to add or remove 

1529 individual objects, but will not under any circumstances load or 

1530 iterate the full set of objects from the database directly. Instead, 

1531 methods such as :meth:`_orm.WriteOnlyCollection.select`, 

1532 :meth:`_orm.WriteOnlyCollection.insert`, 

1533 :meth:`_orm.WriteOnlyCollection.update` and 

1534 :meth:`_orm.WriteOnlyCollection.delete` are provided which generate SQL 

1535 constructs that may be used to load and modify rows in bulk. Used for 

1536 large collections that are never appropriate to load at once into 

1537 memory. 

1538 

1539 The ``write_only`` loader style is configured automatically when 

1540 the :class:`_orm.WriteOnlyMapped` annotation is provided on the 

1541 left hand side within a Declarative mapping. See the section 

1542 :ref:`write_only_relationship` for examples. 

1543 

1544 .. versionadded:: 2.0 

1545 

1546 .. seealso:: 

1547 

1548 :ref:`write_only_relationship` - in the :ref:`queryguide_toplevel` 

1549 

1550 * ``dynamic`` - the attribute will return a pre-configured 

1551 :class:`_query.Query` object for all read 

1552 operations, onto which further filtering operations can be 

1553 applied before iterating the results. 

1554 

1555 The ``dynamic`` loader style is configured automatically when 

1556 the :class:`_orm.DynamicMapped` annotation is provided on the 

1557 left hand side within a Declarative mapping. See the section 

1558 :ref:`dynamic_relationship` for examples. 

1559 

1560 .. legacy:: The "dynamic" lazy loader strategy is the legacy form of 

1561 what is now the "write_only" strategy described in the section 

1562 :ref:`write_only_relationship`. 

1563 

1564 .. seealso:: 

1565 

1566 :ref:`dynamic_relationship` - in the :ref:`queryguide_toplevel` 

1567 

1568 :ref:`write_only_relationship` - more generally useful approach 

1569 for large collections that should not fully load into memory 

1570 

1571 * ``noload`` - no loading should occur at any time. The related 

1572 collection will remain empty. 

1573 

1574 .. deprecated:: 2.1 The ``noload`` loader strategy is deprecated and 

1575 will be removed in a future release. This option produces incorrect 

1576 results by returning ``None`` for related items. 

1577 

1578 * True - a synonym for 'select' 

1579 

1580 * False - a synonym for 'joined' 

1581 

1582 * None - a synonym for 'noload' 

1583 

1584 .. seealso:: 

1585 

1586 :ref:`orm_queryguide_relationship_loaders` - Full documentation on 

1587 relationship loader configuration in the :ref:`queryguide_toplevel`. 

1588 

1589 

1590 :param load_on_pending=False: 

1591 Indicates loading behavior for transient or pending parent objects. 

1592 

1593 When set to ``True``, causes the lazy-loader to 

1594 issue a query for a parent object that is not persistent, meaning it 

1595 has never been flushed. This may take effect for a pending object 

1596 when autoflush is disabled, or for a transient object that has been 

1597 "attached" to a :class:`.Session` but is not part of its pending 

1598 collection. 

1599 

1600 The :paramref:`_orm.relationship.load_on_pending` 

1601 flag does not improve 

1602 behavior when the ORM is used normally - object references should be 

1603 constructed at the object level, not at the foreign key level, so 

1604 that they are present in an ordinary way before a flush proceeds. 

1605 This flag is not not intended for general use. 

1606 

1607 .. seealso:: 

1608 

1609 :meth:`.Session.enable_relationship_loading` - this method 

1610 establishes "load on pending" behavior for the whole object, and 

1611 also allows loading on objects that remain transient or 

1612 detached. 

1613 

1614 :param order_by: 

1615 Indicates the ordering that should be applied when loading these 

1616 items. :paramref:`_orm.relationship.order_by` 

1617 is expected to refer to 

1618 one of the :class:`_schema.Column` 

1619 objects to which the target class is 

1620 mapped, or the attribute itself bound to the target class which 

1621 refers to the column. 

1622 

1623 :paramref:`_orm.relationship.order_by` 

1624 may also be passed as a callable 

1625 function which is evaluated at mapper initialization time, and may 

1626 be passed as a Python-evaluable string when using Declarative. 

1627 

1628 .. warning:: When passed as a Python-evaluable string, the 

1629 argument is interpreted using Python's ``eval()`` function. 

1630 **DO NOT PASS UNTRUSTED INPUT TO THIS STRING**. 

1631 See :ref:`declarative_relationship_eval` for details on 

1632 declarative evaluation of :func:`_orm.relationship` arguments. 

1633 

1634 :param passive_deletes=False: 

1635 Indicates loading behavior during delete operations. 

1636 

1637 A value of True indicates that unloaded child items should not 

1638 be loaded during a delete operation on the parent. Normally, 

1639 when a parent item is deleted, all child items are loaded so 

1640 that they can either be marked as deleted, or have their 

1641 foreign key to the parent set to NULL. Marking this flag as 

1642 True usually implies an ON DELETE <CASCADE|SET NULL> rule is in 

1643 place which will handle updating/deleting child rows on the 

1644 database side. 

1645 

1646 Additionally, setting the flag to the string value 'all' will 

1647 disable the "nulling out" of the child foreign keys, when the parent 

1648 object is deleted and there is no delete or delete-orphan cascade 

1649 enabled. This is typically used when a triggering or error raise 

1650 scenario is in place on the database side. Note that the foreign 

1651 key attributes on in-session child objects will not be changed after 

1652 a flush occurs so this is a very special use-case setting. 

1653 Additionally, the "nulling out" will still occur if the child 

1654 object is de-associated with the parent. 

1655 

1656 .. seealso:: 

1657 

1658 :ref:`passive_deletes` - Introductory documentation 

1659 and examples. 

1660 

1661 :param passive_updates=True: 

1662 Indicates the persistence behavior to take when a referenced 

1663 primary key value changes in place, indicating that the referencing 

1664 foreign key columns will also need their value changed. 

1665 

1666 When True, it is assumed that ``ON UPDATE CASCADE`` is configured on 

1667 the foreign key in the database, and that the database will 

1668 handle propagation of an UPDATE from a source column to 

1669 dependent rows. When False, the SQLAlchemy 

1670 :func:`_orm.relationship` 

1671 construct will attempt to emit its own UPDATE statements to 

1672 modify related targets. However note that SQLAlchemy **cannot** 

1673 emit an UPDATE for more than one level of cascade. Also, 

1674 setting this flag to False is not compatible in the case where 

1675 the database is in fact enforcing referential integrity, unless 

1676 those constraints are explicitly "deferred", if the target backend 

1677 supports it. 

1678 

1679 It is highly advised that an application which is employing 

1680 mutable primary keys keeps ``passive_updates`` set to True, 

1681 and instead uses the referential integrity features of the database 

1682 itself in order to handle the change efficiently and fully. 

1683 

1684 .. seealso:: 

1685 

1686 :ref:`passive_updates` - Introductory documentation and 

1687 examples. 

1688 

1689 :paramref:`.mapper.passive_updates` - a similar flag which 

1690 takes effect for joined-table inheritance mappings. 

1691 

1692 :param post_update: 

1693 This indicates that the relationship should be handled by a 

1694 second UPDATE statement after an INSERT or before a 

1695 DELETE. This flag is used to handle saving bi-directional 

1696 dependencies between two individual rows (i.e. each row 

1697 references the other), where it would otherwise be impossible to 

1698 INSERT or DELETE both rows fully since one row exists before the 

1699 other. Use this flag when a particular mapping arrangement will 

1700 incur two rows that are dependent on each other, such as a table 

1701 that has a one-to-many relationship to a set of child rows, and 

1702 also has a column that references a single child row within that 

1703 list (i.e. both tables contain a foreign key to each other). If 

1704 a flush operation returns an error that a "cyclical 

1705 dependency" was detected, this is a cue that you might want to 

1706 use :paramref:`_orm.relationship.post_update` to "break" the cycle. 

1707 

1708 .. seealso:: 

1709 

1710 :ref:`post_update` - Introductory documentation and examples. 

1711 

1712 :param primaryjoin: 

1713 A SQL expression that will be used as the primary 

1714 join of the child object against the parent object, or in a 

1715 many-to-many relationship the join of the parent object to the 

1716 association table. By default, this value is computed based on the 

1717 foreign key relationships of the parent and child tables (or 

1718 association table). 

1719 

1720 :paramref:`_orm.relationship.primaryjoin` may also be passed as a 

1721 callable function which is evaluated at mapper initialization time, 

1722 and may be passed as a Python-evaluable string when using 

1723 Declarative. 

1724 

1725 .. warning:: When passed as a Python-evaluable string, the 

1726 argument is interpreted using Python's ``eval()`` function. 

1727 **DO NOT PASS UNTRUSTED INPUT TO THIS STRING**. 

1728 See :ref:`declarative_relationship_eval` for details on 

1729 declarative evaluation of :func:`_orm.relationship` arguments. 

1730 

1731 .. seealso:: 

1732 

1733 :ref:`relationship_primaryjoin` 

1734 

1735 :param remote_side: 

1736 Used for self-referential relationships, indicates the column or 

1737 list of columns that form the "remote side" of the relationship. 

1738 

1739 :paramref:`_orm.relationship.remote_side` may also be passed as a 

1740 callable function which is evaluated at mapper initialization time, 

1741 and may be passed as a Python-evaluable string when using 

1742 Declarative. 

1743 

1744 .. warning:: When passed as a Python-evaluable string, the 

1745 argument is interpreted using Python's ``eval()`` function. 

1746 **DO NOT PASS UNTRUSTED INPUT TO THIS STRING**. 

1747 See :ref:`declarative_relationship_eval` for details on 

1748 declarative evaluation of :func:`_orm.relationship` arguments. 

1749 

1750 .. seealso:: 

1751 

1752 :ref:`self_referential` - in-depth explanation of how 

1753 :paramref:`_orm.relationship.remote_side` 

1754 is used to configure self-referential relationships. 

1755 

1756 :func:`.remote` - an annotation function that accomplishes the 

1757 same purpose as :paramref:`_orm.relationship.remote_side`, 

1758 typically 

1759 when a custom :paramref:`_orm.relationship.primaryjoin` condition 

1760 is used. 

1761 

1762 :param query_class: 

1763 A :class:`_query.Query` 

1764 subclass that will be used internally by the 

1765 ``AppenderQuery`` returned by a "dynamic" relationship, that 

1766 is, a relationship that specifies ``lazy="dynamic"`` or was 

1767 otherwise constructed using the :func:`_orm.dynamic_loader` 

1768 function. 

1769 

1770 .. seealso:: 

1771 

1772 :ref:`dynamic_relationship` - Introduction to "dynamic" 

1773 relationship loaders. 

1774 

1775 :param secondaryjoin: 

1776 A SQL expression that will be used as the join of 

1777 an association table to the child object. By default, this value is 

1778 computed based on the foreign key relationships of the association 

1779 and child tables. 

1780 

1781 :paramref:`_orm.relationship.secondaryjoin` may also be passed as a 

1782 callable function which is evaluated at mapper initialization time, 

1783 and may be passed as a Python-evaluable string when using 

1784 Declarative. 

1785 

1786 .. warning:: When passed as a Python-evaluable string, the 

1787 argument is interpreted using Python's ``eval()`` function. 

1788 **DO NOT PASS UNTRUSTED INPUT TO THIS STRING**. 

1789 See :ref:`declarative_relationship_eval` for details on 

1790 declarative evaluation of :func:`_orm.relationship` arguments. 

1791 

1792 .. seealso:: 

1793 

1794 :ref:`relationship_primaryjoin` 

1795 

1796 :param single_parent: 

1797 When True, installs a validator which will prevent objects 

1798 from being associated with more than one parent at a time. 

1799 This is used for many-to-one or many-to-many relationships that 

1800 should be treated either as one-to-one or one-to-many. Its usage 

1801 is optional, except for :func:`_orm.relationship` constructs which 

1802 are many-to-one or many-to-many and also 

1803 specify the ``delete-orphan`` cascade option. The 

1804 :func:`_orm.relationship` construct itself will raise an error 

1805 instructing when this option is required. 

1806 

1807 .. seealso:: 

1808 

1809 :ref:`unitofwork_cascades` - includes detail on when the 

1810 :paramref:`_orm.relationship.single_parent` 

1811 flag may be appropriate. 

1812 

1813 :param uselist: 

1814 A boolean that indicates if this property should be loaded as a 

1815 list or a scalar. In most cases, this value is determined 

1816 automatically by :func:`_orm.relationship` at mapper configuration 

1817 time. When using explicit :class:`_orm.Mapped` annotations, 

1818 :paramref:`_orm.relationship.uselist` may be derived from the 

1819 whether or not the annotation within :class:`_orm.Mapped` contains 

1820 a collection class. 

1821 Otherwise, :paramref:`_orm.relationship.uselist` may be derived from 

1822 the type and direction 

1823 of the relationship - one to many forms a list, many to one 

1824 forms a scalar, many to many is a list. If a scalar is desired 

1825 where normally a list would be present, such as a bi-directional 

1826 one-to-one relationship, use an appropriate :class:`_orm.Mapped` 

1827 annotation or set :paramref:`_orm.relationship.uselist` to False. 

1828 

1829 The :paramref:`_orm.relationship.uselist` 

1830 flag is also available on an 

1831 existing :func:`_orm.relationship` 

1832 construct as a read-only attribute, 

1833 which can be used to determine if this :func:`_orm.relationship` 

1834 deals 

1835 with collections or scalar attributes:: 

1836 

1837 >>> User.addresses.property.uselist 

1838 True 

1839 

1840 .. seealso:: 

1841 

1842 :ref:`relationships_one_to_one` - Introduction to the "one to 

1843 one" relationship pattern, which is typically when an alternate 

1844 setting for :paramref:`_orm.relationship.uselist` is involved. 

1845 

1846 :param viewonly=False: 

1847 When set to ``True``, the relationship is used only for loading 

1848 objects, and not for any persistence operation. A 

1849 :func:`_orm.relationship` which specifies 

1850 :paramref:`_orm.relationship.viewonly` can work 

1851 with a wider range of SQL operations within the 

1852 :paramref:`_orm.relationship.primaryjoin` condition, including 

1853 operations that feature the use of a variety of comparison operators 

1854 as well as SQL functions such as :func:`_expression.cast`. The 

1855 :paramref:`_orm.relationship.viewonly` 

1856 flag is also of general use when defining any kind of 

1857 :func:`_orm.relationship` that doesn't represent 

1858 the full set of related objects, to prevent modifications of the 

1859 collection from resulting in persistence operations. 

1860 

1861 .. seealso:: 

1862 

1863 :ref:`relationship_viewonly_notes` - more details on best practices 

1864 when using :paramref:`_orm.relationship.viewonly`. 

1865 

1866 :param sync_backref: 

1867 A boolean that enables the events used to synchronize the in-Python 

1868 attributes when this relationship is target of either 

1869 :paramref:`_orm.relationship.backref` or 

1870 :paramref:`_orm.relationship.back_populates`. 

1871 

1872 Defaults to ``None``, which indicates that an automatic value should 

1873 be selected based on the value of the 

1874 :paramref:`_orm.relationship.viewonly` flag. When left at its 

1875 default, changes in state will be back-populated only if neither 

1876 sides of a relationship is viewonly. 

1877 

1878 .. versionchanged:: 1.4 - A relationship that specifies 

1879 :paramref:`_orm.relationship.viewonly` automatically implies 

1880 that :paramref:`_orm.relationship.sync_backref` is ``False``. 

1881 

1882 .. seealso:: 

1883 

1884 :paramref:`_orm.relationship.viewonly` 

1885 

1886 :param omit_join: 

1887 Allows manual control over the "selectin" automatic join 

1888 optimization. Set to ``False`` to disable the "omit join" feature 

1889 added in SQLAlchemy 1.3; or leave as ``None`` to leave automatic 

1890 optimization in place. 

1891 

1892 .. note:: This flag may only be set to ``False``. It is not 

1893 necessary to set it to ``True`` as the "omit_join" optimization is 

1894 automatically detected; if it is not detected, then the 

1895 optimization is not supported. 

1896 

1897 :param default: Specific to :ref:`orm_declarative_native_dataclasses`, 

1898 specifies an immutable scalar default value for the relationship that 

1899 will behave as though it is the default value for the parameter in the 

1900 ``__init__()`` method. This is only supported for a ``uselist=False`` 

1901 relationship, that is many-to-one or one-to-one, and only supports the 

1902 scalar value ``None``, since no other immutable value is valid for such a 

1903 relationship. 

1904 

1905 .. versionchanged:: 2.1 the :paramref:`_orm.relationship.default` 

1906 parameter only supports a value of ``None``. 

1907 

1908 :param init: Specific to :ref:`orm_declarative_native_dataclasses`, 

1909 specifies if the mapped attribute should be part of the ``__init__()`` 

1910 method as generated by the dataclass process. 

1911 :param repr: Specific to :ref:`orm_declarative_native_dataclasses`, 

1912 specifies if the mapped attribute should be part of the ``__repr__()`` 

1913 method as generated by the dataclass process. 

1914 :param default_factory: Specific to 

1915 :ref:`orm_declarative_native_dataclasses`, 

1916 specifies a default-value generation function that will take place 

1917 as part of the ``__init__()`` 

1918 method as generated by the dataclass process. 

1919 :param compare: Specific to 

1920 :ref:`orm_declarative_native_dataclasses`, indicates if this field 

1921 should be included in comparison operations when generating the 

1922 ``__eq__()`` and ``__ne__()`` methods for the mapped class. 

1923 

1924 .. versionadded:: 2.0.0b4 

1925 

1926 :param kw_only: Specific to 

1927 :ref:`orm_declarative_native_dataclasses`, indicates if this field 

1928 should be marked as keyword-only when generating the ``__init__()``. 

1929 

1930 :param hash: Specific to 

1931 :ref:`orm_declarative_native_dataclasses`, controls if this field 

1932 is included when generating the ``__hash__()`` method for the mapped 

1933 class. 

1934 

1935 .. versionadded:: 2.0.36 

1936 

1937 :param dataclass_metadata: Specific to 

1938 :ref:`orm_declarative_native_dataclasses`, supplies metadata 

1939 to be attached to the generated dataclass field. 

1940 

1941 .. versionadded:: 2.0.42 

1942 

1943 """ 

1944 

1945 return _RelationshipDeclared( 

1946 argument, 

1947 secondary=secondary, 

1948 uselist=uselist, 

1949 collection_class=collection_class, 

1950 primaryjoin=primaryjoin, 

1951 secondaryjoin=secondaryjoin, 

1952 back_populates=back_populates, 

1953 order_by=order_by, 

1954 backref=backref, 

1955 overlaps=overlaps, 

1956 post_update=post_update, 

1957 cascade=cascade, 

1958 viewonly=viewonly, 

1959 attribute_options=_AttributeOptions( 

1960 init, 

1961 repr, 

1962 default, 

1963 default_factory, 

1964 compare, 

1965 kw_only, 

1966 hash, 

1967 dataclass_metadata, 

1968 ), 

1969 lazy=lazy, 

1970 passive_deletes=passive_deletes, 

1971 passive_updates=passive_updates, 

1972 active_history=active_history, 

1973 enable_typechecks=enable_typechecks, 

1974 foreign_keys=foreign_keys, 

1975 remote_side=remote_side, 

1976 join_depth=join_depth, 

1977 comparator_factory=comparator_factory, 

1978 single_parent=single_parent, 

1979 innerjoin=innerjoin, 

1980 distinct_target_key=distinct_target_key, 

1981 load_on_pending=load_on_pending, 

1982 query_class=query_class, 

1983 info=info, 

1984 omit_join=omit_join, 

1985 sync_backref=sync_backref, 

1986 **kw, 

1987 ) 

1988 

1989 

1990def synonym( 

1991 name: str, 

1992 *, 

1993 map_column: Optional[bool] = None, 

1994 descriptor: Optional[Any] = None, 

1995 comparator_factory: Optional[Type[PropComparator[_T]]] = None, 

1996 init: Union[_NoArg, bool] = _NoArg.NO_ARG, 

1997 repr: Union[_NoArg, bool] = _NoArg.NO_ARG, # noqa: A002 

1998 default: Union[_NoArg, _T] = _NoArg.NO_ARG, 

1999 default_factory: Union[_NoArg, Callable[[], _T]] = _NoArg.NO_ARG, 

2000 compare: Union[_NoArg, bool] = _NoArg.NO_ARG, 

2001 kw_only: Union[_NoArg, bool] = _NoArg.NO_ARG, 

2002 hash: Union[_NoArg, bool, None] = _NoArg.NO_ARG, # noqa: A002 

2003 info: Optional[_InfoType] = None, 

2004 doc: Optional[str] = None, 

2005 dataclass_metadata: Union[_NoArg, Mapping[Any, Any], None] = _NoArg.NO_ARG, 

2006) -> Synonym[Any]: 

2007 """Denote an attribute name as a synonym to a mapped property, 

2008 in that the attribute will mirror the value and expression behavior 

2009 of another attribute. 

2010 

2011 e.g.:: 

2012 

2013 class MyClass(Base): 

2014 __tablename__ = "my_table" 

2015 

2016 id = Column(Integer, primary_key=True) 

2017 job_status = Column(String(50)) 

2018 

2019 status = synonym("job_status") 

2020 

2021 :param name: the name of the existing mapped property. This 

2022 can refer to the string name ORM-mapped attribute 

2023 configured on the class, including column-bound attributes 

2024 and relationships. 

2025 

2026 :param descriptor: a Python :term:`descriptor` that will be used 

2027 as a getter (and potentially a setter) when this attribute is 

2028 accessed at the instance level. 

2029 

2030 :param map_column: **For classical mappings and mappings against 

2031 an existing Table object only**. if ``True``, the :func:`.synonym` 

2032 construct will locate the :class:`_schema.Column` 

2033 object upon the mapped 

2034 table that would normally be associated with the attribute name of 

2035 this synonym, and produce a new :class:`.ColumnProperty` that instead 

2036 maps this :class:`_schema.Column` 

2037 to the alternate name given as the "name" 

2038 argument of the synonym; in this way, the usual step of redefining 

2039 the mapping of the :class:`_schema.Column` 

2040 to be under a different name is 

2041 unnecessary. This is usually intended to be used when a 

2042 :class:`_schema.Column` 

2043 is to be replaced with an attribute that also uses a 

2044 descriptor, that is, in conjunction with the 

2045 :paramref:`.synonym.descriptor` parameter:: 

2046 

2047 my_table = Table( 

2048 "my_table", 

2049 metadata, 

2050 Column("id", Integer, primary_key=True), 

2051 Column("job_status", String(50)), 

2052 ) 

2053 

2054 

2055 class MyClass: 

2056 @property 

2057 def _job_status_descriptor(self): 

2058 return "Status: %s" % self._job_status 

2059 

2060 

2061 mapper( 

2062 MyClass, 

2063 my_table, 

2064 properties={ 

2065 "job_status": synonym( 

2066 "_job_status", 

2067 map_column=True, 

2068 descriptor=MyClass._job_status_descriptor, 

2069 ) 

2070 }, 

2071 ) 

2072 

2073 Above, the attribute named ``_job_status`` is automatically 

2074 mapped to the ``job_status`` column:: 

2075 

2076 >>> j1 = MyClass() 

2077 >>> j1._job_status = "employed" 

2078 >>> j1.job_status 

2079 Status: employed 

2080 

2081 When using Declarative, in order to provide a descriptor in 

2082 conjunction with a synonym, use the 

2083 :func:`sqlalchemy.ext.declarative.synonym_for` helper. However, 

2084 note that the :ref:`hybrid properties <mapper_hybrids>` feature 

2085 should usually be preferred, particularly when redefining attribute 

2086 behavior. 

2087 

2088 :param info: Optional data dictionary which will be populated into the 

2089 :attr:`.InspectionAttr.info` attribute of this object. 

2090 

2091 :param comparator_factory: A subclass of :class:`.PropComparator` 

2092 that will provide custom comparison behavior at the SQL expression 

2093 level. 

2094 

2095 .. note:: 

2096 

2097 For the use case of providing an attribute which redefines both 

2098 Python-level and SQL-expression level behavior of an attribute, 

2099 please refer to the Hybrid attribute introduced at 

2100 :ref:`mapper_hybrids` for a more effective technique. 

2101 

2102 .. seealso:: 

2103 

2104 :ref:`synonyms` - Overview of synonyms 

2105 

2106 :func:`.synonym_for` - a helper oriented towards Declarative 

2107 

2108 :ref:`mapper_hybrids` - The Hybrid Attribute extension provides an 

2109 updated approach to augmenting attribute behavior more flexibly 

2110 than can be achieved with synonyms. 

2111 

2112 """ 

2113 return Synonym( 

2114 name, 

2115 map_column=map_column, 

2116 descriptor=descriptor, 

2117 comparator_factory=comparator_factory, 

2118 attribute_options=_AttributeOptions( 

2119 init, 

2120 repr, 

2121 default, 

2122 default_factory, 

2123 compare, 

2124 kw_only, 

2125 hash, 

2126 dataclass_metadata, 

2127 ), 

2128 doc=doc, 

2129 info=info, 

2130 ) 

2131 

2132 

2133def create_session( 

2134 bind: Optional[_SessionBind] = None, **kwargs: Any 

2135) -> Session: 

2136 r"""Create a new :class:`.Session` 

2137 with no automation enabled by default. 

2138 

2139 This function is used primarily for testing. The usual 

2140 route to :class:`.Session` creation is via its constructor 

2141 or the :func:`.sessionmaker` function. 

2142 

2143 :param bind: optional, a single Connectable to use for all 

2144 database access in the created 

2145 :class:`~sqlalchemy.orm.session.Session`. 

2146 

2147 :param \*\*kwargs: optional, passed through to the 

2148 :class:`.Session` constructor. 

2149 

2150 :returns: an :class:`~sqlalchemy.orm.session.Session` instance 

2151 

2152 The defaults of create_session() are the opposite of that of 

2153 :func:`sessionmaker`; ``autoflush`` and ``expire_on_commit`` are 

2154 False. 

2155 

2156 Usage:: 

2157 

2158 >>> from sqlalchemy.orm import create_session 

2159 >>> session = create_session() 

2160 

2161 It is recommended to use :func:`sessionmaker` instead of 

2162 create_session(). 

2163 

2164 """ 

2165 

2166 kwargs.setdefault("autoflush", False) 

2167 kwargs.setdefault("expire_on_commit", False) 

2168 return Session(bind=bind, **kwargs) 

2169 

2170 

2171def _mapper_fn(*arg: Any, **kw: Any) -> NoReturn: 

2172 """Placeholder for the now-removed ``mapper()`` function. 

2173 

2174 Classical mappings should be performed using the 

2175 :meth:`_orm.registry.map_imperatively` method. 

2176 

2177 This symbol remains in SQLAlchemy 2.0 to suit the deprecated use case 

2178 of using the ``mapper()`` function as a target for ORM event listeners, 

2179 which failed to be marked as deprecated in the 1.4 series. 

2180 

2181 Global ORM mapper listeners should instead use the :class:`_orm.Mapper` 

2182 class as the target. 

2183 

2184 .. versionchanged:: 2.0 The ``mapper()`` function was removed; the 

2185 symbol remains temporarily as a placeholder for the event listening 

2186 use case. 

2187 

2188 """ 

2189 raise InvalidRequestError( 

2190 "The 'sqlalchemy.orm.mapper()' function is removed as of " 

2191 "SQLAlchemy 2.0. Use the " 

2192 "'sqlalchemy.orm.registry.map_imperatively()` " 

2193 "method of the ``sqlalchemy.orm.registry`` class to perform " 

2194 "classical mapping." 

2195 ) 

2196 

2197 

2198def dynamic_loader( 

2199 argument: Optional[_RelationshipArgumentType[Any]] = None, **kw: Any 

2200) -> RelationshipProperty[Any]: 

2201 """Construct a dynamically-loading mapper property. 

2202 

2203 This is essentially the same as 

2204 using the ``lazy='dynamic'`` argument with :func:`relationship`:: 

2205 

2206 dynamic_loader(SomeClass) 

2207 

2208 # is the same as 

2209 

2210 relationship(SomeClass, lazy="dynamic") 

2211 

2212 See the section :ref:`dynamic_relationship` for more details 

2213 on dynamic loading. 

2214 

2215 """ 

2216 kw["lazy"] = "dynamic" 

2217 return relationship(argument, **kw) 

2218 

2219 

2220def backref(name: str, **kwargs: Any) -> ORMBackrefArgument: 

2221 """When using the :paramref:`_orm.relationship.backref` parameter, 

2222 provides specific parameters to be used when the new 

2223 :func:`_orm.relationship` is generated. 

2224 

2225 E.g.:: 

2226 

2227 "items": relationship(SomeItem, backref=backref("parent", lazy="subquery")) 

2228 

2229 The :paramref:`_orm.relationship.backref` parameter is generally 

2230 considered to be legacy; for modern applications, using 

2231 explicit :func:`_orm.relationship` constructs linked together using 

2232 the :paramref:`_orm.relationship.back_populates` parameter should be 

2233 preferred. 

2234 

2235 .. seealso:: 

2236 

2237 :ref:`relationships_backref` - background on backrefs 

2238 

2239 """ # noqa: E501 

2240 

2241 return (name, kwargs) 

2242 

2243 

2244def deferred( 

2245 column: _ORMColumnExprArgument[_T], 

2246 *additional_columns: _ORMColumnExprArgument[Any], 

2247 group: Optional[str] = None, 

2248 raiseload: bool = False, 

2249 comparator_factory: Optional[Type[PropComparator[_T]]] = None, 

2250 init: Union[_NoArg, bool] = _NoArg.NO_ARG, 

2251 repr: Union[_NoArg, bool] = _NoArg.NO_ARG, # noqa: A002 

2252 default: Optional[Any] = _NoArg.NO_ARG, 

2253 default_factory: Union[_NoArg, Callable[[], _T]] = _NoArg.NO_ARG, 

2254 compare: Union[_NoArg, bool] = _NoArg.NO_ARG, 

2255 kw_only: Union[_NoArg, bool] = _NoArg.NO_ARG, 

2256 hash: Union[_NoArg, bool, None] = _NoArg.NO_ARG, # noqa: A002 

2257 active_history: bool = False, 

2258 expire_on_flush: bool = True, 

2259 info: Optional[_InfoType] = None, 

2260 doc: Optional[str] = None, 

2261 dataclass_metadata: Union[_NoArg, Mapping[Any, Any], None] = _NoArg.NO_ARG, 

2262) -> MappedSQLExpression[_T]: 

2263 r"""Indicate a column-based mapped attribute that by default will 

2264 not load unless accessed. 

2265 

2266 When using :func:`_orm.mapped_column`, the same functionality as 

2267 that of :func:`_orm.deferred` construct is provided by using the 

2268 :paramref:`_orm.mapped_column.deferred` parameter. 

2269 

2270 :param \*columns: columns to be mapped. This is typically a single 

2271 :class:`_schema.Column` object, 

2272 however a collection is supported in order 

2273 to support multiple columns mapped under the same attribute. 

2274 

2275 :param raiseload: boolean, if True, indicates an exception should be raised 

2276 if the load operation is to take place. 

2277 

2278 .. versionadded:: 1.4 

2279 

2280 

2281 Additional arguments are the same as that of :func:`_orm.column_property`. 

2282 

2283 .. seealso:: 

2284 

2285 :ref:`orm_queryguide_deferred_imperative` 

2286 

2287 """ 

2288 return MappedSQLExpression( 

2289 column, 

2290 *additional_columns, 

2291 attribute_options=_AttributeOptions( 

2292 init, 

2293 repr, 

2294 default, 

2295 default_factory, 

2296 compare, 

2297 kw_only, 

2298 hash, 

2299 dataclass_metadata, 

2300 ), 

2301 group=group, 

2302 deferred=True, 

2303 raiseload=raiseload, 

2304 comparator_factory=comparator_factory, 

2305 active_history=active_history, 

2306 expire_on_flush=expire_on_flush, 

2307 info=info, 

2308 doc=doc, 

2309 ) 

2310 

2311 

2312def query_expression( 

2313 default_expr: _ORMColumnExprArgument[_T] = sql.null(), 

2314 *, 

2315 repr: Union[_NoArg, bool] = _NoArg.NO_ARG, # noqa: A002 

2316 compare: Union[_NoArg, bool] = _NoArg.NO_ARG, # noqa: A002 

2317 expire_on_flush: bool = True, 

2318 info: Optional[_InfoType] = None, 

2319 doc: Optional[str] = None, 

2320) -> MappedSQLExpression[_T]: 

2321 """Indicate an attribute that populates from a query-time SQL expression. 

2322 

2323 :param default_expr: Optional SQL expression object that will be used in 

2324 all cases if not assigned later with :func:`_orm.with_expression`. 

2325 

2326 .. seealso:: 

2327 

2328 :ref:`orm_queryguide_with_expression` - background and usage examples 

2329 

2330 """ 

2331 prop = MappedSQLExpression( 

2332 default_expr, 

2333 attribute_options=_AttributeOptions( 

2334 False, 

2335 repr, 

2336 _NoArg.NO_ARG, 

2337 _NoArg.NO_ARG, 

2338 compare, 

2339 _NoArg.NO_ARG, 

2340 _NoArg.NO_ARG, 

2341 _NoArg.NO_ARG, 

2342 ), 

2343 expire_on_flush=expire_on_flush, 

2344 info=info, 

2345 doc=doc, 

2346 _assume_readonly_dc_attributes=True, 

2347 ) 

2348 

2349 prop.strategy_key = (("query_expression", True),) 

2350 return prop 

2351 

2352 

2353def clear_mappers() -> None: 

2354 """Remove all mappers from all classes. 

2355 

2356 .. versionchanged:: 1.4 This function now locates all 

2357 :class:`_orm.registry` objects and calls upon the 

2358 :meth:`_orm.registry.dispose` method of each. 

2359 

2360 This function removes all instrumentation from classes and disposes 

2361 of their associated mappers. Once called, the classes are unmapped 

2362 and can be later re-mapped with new mappers. 

2363 

2364 :func:`.clear_mappers` is *not* for normal use, as there is literally no 

2365 valid usage for it outside of very specific testing scenarios. Normally, 

2366 mappers are permanent structural components of user-defined classes, and 

2367 are never discarded independently of their class. If a mapped class 

2368 itself is garbage collected, its mapper is automatically disposed of as 

2369 well. As such, :func:`.clear_mappers` is only for usage in test suites 

2370 that reuse the same classes with different mappings, which is itself an 

2371 extremely rare use case - the only such use case is in fact SQLAlchemy's 

2372 own test suite, and possibly the test suites of other ORM extension 

2373 libraries which intend to test various combinations of mapper construction 

2374 upon a fixed set of classes. 

2375 

2376 """ 

2377 

2378 mapperlib._dispose_registries(mapperlib._all_registries(), False) 

2379 

2380 

2381# I would really like a way to get the Type[] here that shows up 

2382# in a different way in typing tools, however there is no current method 

2383# that is accepted by mypy (subclass of Type[_O] works in pylance, rejected 

2384# by mypy). 

2385AliasedType = Annotated[Type[_O], "aliased"] 

2386 

2387 

2388@overload 

2389def aliased( 

2390 element: Type[_O], 

2391 alias: Optional[FromClause] = None, 

2392 name: Optional[str] = None, 

2393 flat: bool = False, 

2394 adapt_on_names: bool = False, 

2395) -> AliasedType[_O]: ... 

2396 

2397 

2398@overload 

2399def aliased( 

2400 element: Union[AliasedClass[_O], Mapper[_O], AliasedInsp[_O]], 

2401 alias: Optional[FromClause] = None, 

2402 name: Optional[str] = None, 

2403 flat: bool = False, 

2404 adapt_on_names: bool = False, 

2405) -> AliasedClass[_O]: ... 

2406 

2407 

2408@overload 

2409def aliased( 

2410 element: FromClause, 

2411 alias: None = None, 

2412 name: Optional[str] = None, 

2413 flat: bool = False, 

2414 adapt_on_names: bool = False, 

2415) -> FromClause: ... 

2416 

2417 

2418def aliased( 

2419 element: Union[_EntityType[_O], FromClause], 

2420 alias: Optional[FromClause] = None, 

2421 name: Optional[str] = None, 

2422 flat: bool = False, 

2423 adapt_on_names: bool = False, 

2424) -> Union[AliasedClass[_O], FromClause, AliasedType[_O]]: 

2425 """Produce an alias of the given element, usually an :class:`.AliasedClass` 

2426 instance. 

2427 

2428 E.g.:: 

2429 

2430 my_alias = aliased(MyClass) 

2431 

2432 stmt = select(MyClass, my_alias).filter(MyClass.id > my_alias.id) 

2433 result = session.execute(stmt) 

2434 

2435 The :func:`.aliased` function is used to create an ad-hoc mapping of a 

2436 mapped class to a new selectable. By default, a selectable is generated 

2437 from the normally mapped selectable (typically a :class:`_schema.Table` 

2438 ) using the 

2439 :meth:`_expression.FromClause.alias` method. However, :func:`.aliased` 

2440 can also be 

2441 used to link the class to a new :func:`_expression.select` statement. 

2442 Also, the :func:`.with_polymorphic` function is a variant of 

2443 :func:`.aliased` that is intended to specify a so-called "polymorphic 

2444 selectable", that corresponds to the union of several joined-inheritance 

2445 subclasses at once. 

2446 

2447 For convenience, the :func:`.aliased` function also accepts plain 

2448 :class:`_expression.FromClause` constructs, such as a 

2449 :class:`_schema.Table` or 

2450 :func:`_expression.select` construct. In those cases, the 

2451 :meth:`_expression.FromClause.alias` 

2452 method is called on the object and the new 

2453 :class:`_expression.Alias` object returned. The returned 

2454 :class:`_expression.Alias` is not 

2455 ORM-mapped in this case. 

2456 

2457 .. seealso:: 

2458 

2459 :ref:`tutorial_orm_entity_aliases` - in the :ref:`unified_tutorial` 

2460 

2461 :ref:`orm_queryguide_orm_aliases` - in the :ref:`queryguide_toplevel` 

2462 

2463 :param element: element to be aliased. Is normally a mapped class, 

2464 but for convenience can also be a :class:`_expression.FromClause` 

2465 element. 

2466 

2467 :param alias: Optional selectable unit to map the element to. This is 

2468 usually used to link the object to a subquery, and should be an aliased 

2469 select construct as one would produce from the 

2470 :meth:`_query.Query.subquery` method or 

2471 the :meth:`_expression.Select.subquery` or 

2472 :meth:`_expression.Select.alias` methods of the :func:`_expression.select` 

2473 construct. 

2474 

2475 :param name: optional string name to use for the alias, if not specified 

2476 by the ``alias`` parameter. The name, among other things, forms the 

2477 attribute name that will be accessible via tuples returned by a 

2478 :class:`_query.Query` object. Not supported when creating aliases 

2479 of :class:`_sql.Join` objects. 

2480 

2481 :param flat: Boolean, will be passed through to the 

2482 :meth:`_expression.FromClause.alias` call so that aliases of 

2483 :class:`_expression.Join` objects will alias the individual tables 

2484 inside the join, rather than creating a subquery. This is generally 

2485 supported by all modern databases with regards to right-nested joins 

2486 and generally produces more efficient queries. 

2487 

2488 When :paramref:`_orm.aliased.flat` is combined with 

2489 :paramref:`_orm.aliased.name`, the resulting joins will alias individual 

2490 tables using a naming scheme similar to ``<prefix>_<tablename>``. This 

2491 naming scheme is for visibility / debugging purposes only and the 

2492 specific scheme is subject to change without notice. 

2493 

2494 .. versionadded:: 2.0.32 added support for combining 

2495 :paramref:`_orm.aliased.name` with :paramref:`_orm.aliased.flat`. 

2496 Previously, this would raise ``NotImplementedError``. 

2497 

2498 :param adapt_on_names: if True, more liberal "matching" will be used when 

2499 mapping the mapped columns of the ORM entity to those of the 

2500 given selectable - a name-based match will be performed if the 

2501 given selectable doesn't otherwise have a column that corresponds 

2502 to one on the entity. The use case for this is when associating 

2503 an entity with some derived selectable such as one that uses 

2504 aggregate functions:: 

2505 

2506 class UnitPrice(Base): 

2507 __tablename__ = "unit_price" 

2508 ... 

2509 unit_id = Column(Integer) 

2510 price = Column(Numeric) 

2511 

2512 

2513 aggregated_unit_price = ( 

2514 Session.query(func.sum(UnitPrice.price).label("price")) 

2515 .group_by(UnitPrice.unit_id) 

2516 .subquery() 

2517 ) 

2518 

2519 aggregated_unit_price = aliased( 

2520 UnitPrice, alias=aggregated_unit_price, adapt_on_names=True 

2521 ) 

2522 

2523 Above, functions on ``aggregated_unit_price`` which refer to 

2524 ``.price`` will return the 

2525 ``func.sum(UnitPrice.price).label('price')`` column, as it is 

2526 matched on the name "price". Ordinarily, the "price" function 

2527 wouldn't have any "column correspondence" to the actual 

2528 ``UnitPrice.price`` column as it is not a proxy of the original. 

2529 

2530 """ 

2531 return AliasedInsp._alias_factory( 

2532 element, 

2533 alias=alias, 

2534 name=name, 

2535 flat=flat, 

2536 adapt_on_names=adapt_on_names, 

2537 ) 

2538 

2539 

2540def with_polymorphic( 

2541 base: Union[Type[_O], Mapper[_O]], 

2542 classes: Union[Literal["*"], Iterable[Type[Any]]], 

2543 selectable: Union[Literal[False, None], FromClause] = False, 

2544 flat: bool = False, 

2545 polymorphic_on: Optional[ColumnElement[Any]] = None, 

2546 aliased: bool = False, 

2547 innerjoin: bool = False, 

2548 adapt_on_names: bool = False, 

2549 name: Optional[str] = None, 

2550 _use_mapper_path: bool = False, 

2551) -> AliasedClass[_O]: 

2552 """Produce an :class:`.AliasedClass` construct which specifies 

2553 columns for descendant mappers of the given base. 

2554 

2555 Using this method will ensure that each descendant mapper's 

2556 tables are included in the FROM clause, and will allow filter() 

2557 criterion to be used against those tables. The resulting 

2558 instances will also have those columns already loaded so that 

2559 no "post fetch" of those columns will be required. 

2560 

2561 .. seealso:: 

2562 

2563 :ref:`with_polymorphic` - full discussion of 

2564 :func:`_orm.with_polymorphic`. 

2565 

2566 :param base: Base class to be aliased. 

2567 

2568 :param classes: a single class or mapper, or list of 

2569 class/mappers, which inherit from the base class. 

2570 Alternatively, it may also be the string ``'*'``, in which case 

2571 all descending mapped classes will be added to the FROM clause. 

2572 

2573 :param aliased: when True, the selectable will be aliased. For a 

2574 JOIN, this means the JOIN will be SELECTed from inside of a subquery 

2575 unless the :paramref:`_orm.with_polymorphic.flat` flag is set to 

2576 True, which is recommended for simpler use cases. 

2577 

2578 :param flat: Boolean, will be passed through to the 

2579 :meth:`_expression.FromClause.alias` call so that aliases of 

2580 :class:`_expression.Join` objects will alias the individual tables 

2581 inside the join, rather than creating a subquery. This is generally 

2582 supported by all modern databases with regards to right-nested joins 

2583 and generally produces more efficient queries. Setting this flag is 

2584 recommended as long as the resulting SQL is functional. 

2585 

2586 :param selectable: a table or subquery that will 

2587 be used in place of the generated FROM clause. This argument is 

2588 required if any of the desired classes use concrete table 

2589 inheritance, since SQLAlchemy currently cannot generate UNIONs 

2590 among tables automatically. If used, the ``selectable`` argument 

2591 must represent the full set of tables and columns mapped by every 

2592 mapped class. Otherwise, the unaccounted mapped columns will 

2593 result in their table being appended directly to the FROM clause 

2594 which will usually lead to incorrect results. 

2595 

2596 When left at its default value of ``False``, the polymorphic 

2597 selectable assigned to the base mapper is used for selecting rows. 

2598 However, it may also be passed as ``None``, which will bypass the 

2599 configured polymorphic selectable and instead construct an ad-hoc 

2600 selectable for the target classes given; for joined table inheritance 

2601 this will be a join that includes all target mappers and their 

2602 subclasses. 

2603 

2604 :param polymorphic_on: a column to be used as the "discriminator" 

2605 column for the given selectable. If not given, the polymorphic_on 

2606 attribute of the base classes' mapper will be used, if any. This 

2607 is useful for mappings that don't have polymorphic loading 

2608 behavior by default. 

2609 

2610 :param innerjoin: if True, an INNER JOIN will be used. This should 

2611 only be specified if querying for one specific subtype only 

2612 

2613 :param adapt_on_names: Passes through the 

2614 :paramref:`_orm.aliased.adapt_on_names` 

2615 parameter to the aliased object. This may be useful in situations where 

2616 the given selectable is not directly related to the existing mapped 

2617 selectable. 

2618 

2619 .. versionadded:: 1.4.33 

2620 

2621 :param name: Name given to the generated :class:`.AliasedClass`. 

2622 

2623 .. versionadded:: 2.0.31 

2624 

2625 """ 

2626 return AliasedInsp._with_polymorphic_factory( 

2627 base, 

2628 classes, 

2629 selectable=selectable, 

2630 flat=flat, 

2631 polymorphic_on=polymorphic_on, 

2632 adapt_on_names=adapt_on_names, 

2633 aliased=aliased, 

2634 innerjoin=innerjoin, 

2635 name=name, 

2636 _use_mapper_path=_use_mapper_path, 

2637 ) 

2638 

2639 

2640def join( 

2641 left: _FromClauseArgument, 

2642 right: _FromClauseArgument, 

2643 onclause: Optional[_OnClauseArgument] = None, 

2644 isouter: bool = False, 

2645 full: bool = False, 

2646) -> _ORMJoin: 

2647 r"""Produce an inner join between left and right clauses. 

2648 

2649 :func:`_orm.join` is an extension to the core join interface 

2650 provided by :func:`_expression.join()`, where the 

2651 left and right selectable may be not only core selectable 

2652 objects such as :class:`_schema.Table`, but also mapped classes or 

2653 :class:`.AliasedClass` instances. The "on" clause can 

2654 be a SQL expression or an ORM mapped attribute 

2655 referencing a configured :func:`_orm.relationship`. 

2656 

2657 :func:`_orm.join` is not commonly needed in modern usage, 

2658 as its functionality is encapsulated within that of the 

2659 :meth:`_sql.Select.join` and :meth:`_query.Query.join` 

2660 methods. which feature a 

2661 significant amount of automation beyond :func:`_orm.join` 

2662 by itself. Explicit use of :func:`_orm.join` 

2663 with ORM-enabled SELECT statements involves use of the 

2664 :meth:`_sql.Select.select_from` method, as in:: 

2665 

2666 from sqlalchemy.orm import join 

2667 

2668 stmt = ( 

2669 select(User) 

2670 .select_from(join(User, Address, User.addresses)) 

2671 .filter(Address.email_address == "foo@bar.com") 

2672 ) 

2673 

2674 In modern SQLAlchemy the above join can be written more 

2675 succinctly as:: 

2676 

2677 stmt = ( 

2678 select(User) 

2679 .join(User.addresses) 

2680 .filter(Address.email_address == "foo@bar.com") 

2681 ) 

2682 

2683 .. warning:: using :func:`_orm.join` directly may not work properly 

2684 with modern ORM options such as :func:`_orm.with_loader_criteria`. 

2685 It is strongly recommended to use the idiomatic join patterns 

2686 provided by methods such as :meth:`.Select.join` and 

2687 :meth:`.Select.join_from` when creating ORM joins. 

2688 

2689 .. seealso:: 

2690 

2691 :ref:`orm_queryguide_joins` - in the :ref:`queryguide_toplevel` for 

2692 background on idiomatic ORM join patterns 

2693 

2694 """ 

2695 return _ORMJoin(left, right, onclause, isouter, full) 

2696 

2697 

2698def outerjoin( 

2699 left: _FromClauseArgument, 

2700 right: _FromClauseArgument, 

2701 onclause: Optional[_OnClauseArgument] = None, 

2702 full: bool = False, 

2703) -> _ORMJoin: 

2704 """Produce a left outer join between left and right clauses. 

2705 

2706 This is the "outer join" version of the :func:`_orm.join` function, 

2707 featuring the same behavior except that an OUTER JOIN is generated. 

2708 See that function's documentation for other usage details. 

2709 

2710 """ 

2711 return _ORMJoin(left, right, onclause, True, full)