ORM Internals

Key ORM constructs, not otherwise covered in other sections, are listed here.

Object NameDescription

AttributeEventToken

A token propagated throughout the course of a chain of attribute events.

AttributeState

Provide an inspection interface corresponding to a particular attribute on a particular mapped object.

CascadeOptions

Keeps track of the options sent to relationship.cascade

ClassManager

Tracks state information at the class level.

ColumnProperty

Describes an object attribute that corresponds to a table column or other column expression.

Composite

Declarative-compatible front-end for the CompositeProperty class.

CompositeProperty

Defines a “composite” mapped attribute, representing a collection of columns as one attribute.

IdentityMap

InspectionAttr

A base class applied to all ORM objects and attributes that are related to things that can be returned by the inspect() function.

InspectionAttrExtensionType

Symbols indicating the type of extension that a InspectionAttr is part of.

InspectionAttrInfo

Adds the .info attribute to InspectionAttr.

InstanceState

tracks state information at the instance level.

InstrumentedAttribute

Base class for descriptor objects that intercept attribute events on behalf of a MapperProperty object. The actual MapperProperty is accessible via the QueryableAttribute.property attribute.

LoaderCallableStatus

An enumeration.

Mapped

Represent an ORM mapped attribute on a mapped class.

MappedColumn

Maps a single Column on a class.

MappedSQLExpression

Declarative front-end for the ColumnProperty class.

MapperProperty

Represent a particular class attribute mapped by Mapper.

merge_frozen_result(session, statement, frozen_result[, load])

Merge a FrozenResult back into a Session, returning a new Result object with persistent objects.

merge_result(query, iterator[, load])

Merge a result into the given Query object’s Session.

NotExtension

An enumeration.

PropComparator

Defines SQL operations for ORM mapped attributes.

QueryableAttribute

Base class for descriptor objects that intercept attribute events on behalf of a MapperProperty object. The actual MapperProperty is accessible via the QueryableAttribute.property attribute.

QueryContext

Relationship

Describes an object property that holds a single item or list of items that correspond to a related database table.

RelationshipDirection

enumeration which indicates the ‘direction’ of a RelationshipProperty.

RelationshipProperty

Describes an object property that holds a single item or list of items that correspond to a related database table.

SQLORMExpression

A type that may be used to indicate any ORM-level attribute or object that acts in place of one, in the context of SQL expression construction.

Synonym

Declarative front-end for the SynonymProperty class.

SynonymProperty

Denote an attribute name as a synonym to a mapped property, in that the attribute will mirror the value and expression behavior of another attribute.

UOWTransaction

class sqlalchemy.orm.AttributeState

Provide an inspection interface corresponding to a particular attribute on a particular mapped object.

The AttributeState object is accessed via the InstanceState.attrs collection of a particular InstanceState:

Members

history, load_history(), loaded_value, value

  1. from sqlalchemy import inspect
  2. insp = inspect(some_mapped_object)
  3. attr_state = insp.attrs.some_attribute
  • attribute sqlalchemy.orm.AttributeState.history

    Return the current pre-flush change history for this attribute, via the History interface.

    This method will not emit loader callables if the value of the attribute is unloaded.

    Note

    The attribute history system tracks changes on a per flush basis. Each time the Session is flushed, the history of each attribute is reset to empty. The Session by default autoflushes each time a Query is invoked. For options on how to control this, see Flushing.

    See also

    AttributeState.load_history() - retrieve history using loader callables if the value is not locally present.

    get_history() - underlying function

  • method sqlalchemy.orm.AttributeState.load_history() → History

    Return the current pre-flush change history for this attribute, via the History interface.

    This method will emit loader callables if the value of the attribute is unloaded.

    Note

    The attribute history system tracks changes on a per flush basis. Each time the Session is flushed, the history of each attribute is reset to empty. The Session by default autoflushes each time a Query is invoked. For options on how to control this, see Flushing.

    See also

    AttributeState.history

    get_history() - underlying function

    New in version 0.9.0.

  • attribute sqlalchemy.orm.AttributeState.loaded_value

    The current value of this attribute as loaded from the database.

    If the value has not been loaded, or is otherwise not present in the object’s dictionary, returns NO_VALUE.

  • attribute sqlalchemy.orm.AttributeState.value

    Return the value of this attribute.

    This operation is equivalent to accessing the object’s attribute directly or via getattr(), and will fire off any pending loader callables if needed.

class sqlalchemy.orm.CascadeOptions

Keeps track of the options sent to relationship.cascade

Class signature

class sqlalchemy.orm.CascadeOptions (builtins.frozenset, typing.Generic)

class sqlalchemy.orm.ClassManager

Tracks state information at the class level.

Members

deferred_scalar_loader, expired_attribute_loader, has_parent(), manage(), state_getter(), unregister()

Class signature

class sqlalchemy.orm.ClassManager (sqlalchemy.util.langhelpers.HasMemoized, builtins.dict, typing.Generic, sqlalchemy.event.registry.EventTarget)

class sqlalchemy.orm.ColumnProperty

Describes an object attribute that corresponds to a table column or other column expression.

Public constructor is the column_property() function.

Members

expressions, operate(), reverse_operate(), columns_to_assign, declarative_scan(), do_init(), expression, instrument_class(), mapper_property_to_assign, merge()

Class signature

class sqlalchemy.orm.ColumnProperty (sqlalchemy.orm._MapsColumns, sqlalchemy.orm.StrategizedProperty, sqlalchemy.orm._IntrospectsAnnotations, sqlalchemy.log.Identified)

  • class Comparator

    Produce boolean, comparison, and other operators for ColumnProperty attributes.

    See the documentation for PropComparator for a brief overview.

    See also

    PropComparator

    ColumnOperators

    Redefining and Creating New Operators

    TypeEngine.comparator_factory

    Class signature

    class sqlalchemy.orm.ColumnProperty.Comparator (sqlalchemy.util.langhelpers.MemoizedSlots, sqlalchemy.orm.PropComparator)

    • attribute sqlalchemy.orm.ColumnProperty.Comparator.expressions: Sequence[NamedColumn[Any]]

      The full sequence of columns referenced by this

      attribute, adjusted for any aliasing in progress.

      New in version 1.3.17.

      See also

      Mapping a Class against Multiple Tables - usage example

    • method sqlalchemy.orm.ColumnProperty.Comparator.operate(op: OperatorType, *other: Any, **kwargs: Any) → ColumnElement[Any]

      Operate on an argument.

      This is the lowest level of operation, raises NotImplementedError by default.

      Overriding this on a subclass can allow common behavior to be applied to all operations. For example, overriding ColumnOperators to apply func.lower() to the left and right side:

      1. class MyComparator(ColumnOperators):
      2. def operate(self, op, other, **kwargs):
      3. return op(func.lower(self), func.lower(other), **kwargs)

      Parameters:

      • op – Operator callable.

      • *other – the ‘other’ side of the operation. Will be a single scalar for most operations.

      • **kwargs – modifiers. These may be passed by special operators such as ColumnOperators.contains().

    • method sqlalchemy.orm.ColumnProperty.Comparator.reverse_operate(op: OperatorType, other: Any, **kwargs: Any) → ColumnElement[Any]

      Reverse operate on an argument.

      Usage is the same as operate().

  • attribute sqlalchemy.orm.ColumnProperty.columns_to_assign

  • method sqlalchemy.orm.ColumnProperty.declarative_scan(decl_scan: _ClassScanMapperConfig, registry: _RegistryType, cls: Type[Any], originating_module: Optional[str], key: str, mapped_container: Optional[Type[Mapped[Any]]], annotation: Optional[_AnnotationScanType], extracted_mapped_annotation: Optional[_AnnotationScanType], is_dataclass_field: bool) → None

    Perform class-specific initializaton at early declarative scanning time.

    New in version 2.0.

  • method sqlalchemy.orm.ColumnProperty.do_init() → None

    Perform subclass-specific initialization post-mapper-creation steps.

    This is a template method called by the MapperProperty object’s init() method.

  • attribute sqlalchemy.orm.ColumnProperty.expression

    Return the primary column or expression for this ColumnProperty.

    E.g.:

    1. class File(Base):
    2. # ...
    3. name = Column(String(64))
    4. extension = Column(String(8))
    5. filename = column_property(name + '.' + extension)
    6. path = column_property('C:/' + filename.expression)

    See also

    Composing from Column Properties at Mapping Time

  • method sqlalchemy.orm.ColumnProperty.instrument_class(mapper: Mapper[Any]) → None

    Hook called by the Mapper to the property to initiate instrumentation of the class attribute managed by this MapperProperty.

    The MapperProperty here will typically call out to the attributes module to set up an InstrumentedAttribute.

    This step is the first of two steps to set up an InstrumentedAttribute, and is called early in the mapper setup process.

    The second step is typically the init_class_attribute step, called from StrategizedProperty via the post_instrument_class() hook. This step assigns additional state to the InstrumentedAttribute (specifically the “impl”) which has been determined after the MapperProperty has determined what kind of persistence management it needs to do (e.g. scalar, object, collection, etc).

  • attribute sqlalchemy.orm.ColumnProperty.mapper_property_to_assign

  • method sqlalchemy.orm.ColumnProperty.merge(session: Session, source_state: InstanceState[Any], source_dict: _InstanceDict, dest_state: InstanceState[Any], dest_dict: _InstanceDict, load: bool, _recursive: Dict[Any, object], _resolve_conflict_map: Dict[_IdentityKeyType[Any], object]) → None

    Merge the attribute represented by this MapperProperty from source to destination object.

class sqlalchemy.orm.Composite

Declarative-compatible front-end for the CompositeProperty class.

Public constructor is the composite() function.

Changed in version 2.0: Added Composite as a Declarative compatible subclass of CompositeProperty.

See also

Composite Column Types

Class signature

class sqlalchemy.orm.Composite (sqlalchemy.orm.descriptor_props.CompositeProperty, sqlalchemy.orm.base._DeclarativeMapped)

class sqlalchemy.orm.CompositeProperty

Defines a “composite” mapped attribute, representing a collection of columns as one attribute.

CompositeProperty is constructed using the composite() function.

See also

Composite Column Types

Members

create_row_processor(), columns_to_assign, declarative_scan(), do_init(), get_history(), instrument_class(), mapper_property_to_assign

Class signature

class sqlalchemy.orm.CompositeProperty (sqlalchemy.orm._MapsColumns, sqlalchemy.orm._IntrospectsAnnotations, sqlalchemy.orm.descriptor_props.DescriptorProperty)

  • class Comparator

    Produce boolean, comparison, and other operators for Composite attributes.

    See the example in Redefining Comparison Operations for Composites for an overview of usage , as well as the documentation for PropComparator.

    See also

    PropComparator

    ColumnOperators

    Redefining and Creating New Operators

    TypeEngine.comparator_factory

    Class signature

    class sqlalchemy.orm.CompositeProperty.Comparator (sqlalchemy.orm.PropComparator)

  • class CompositeBundle

    Class signature

    class sqlalchemy.orm.CompositeProperty.CompositeBundle (sqlalchemy.orm.Bundle)

    • method sqlalchemy.orm.CompositeProperty.CompositeBundle.create_row_processor(query: Select[Any], procs: Sequence[Callable[[Row[Any]], Any]], labels: Sequence[str]) → Callable[[Row[Any]], Any]

      Produce the “row processing” function for this Bundle.

      May be overridden by subclasses to provide custom behaviors when results are fetched. The method is passed the statement object and a set of “row processor” functions at query execution time; these processor functions when given a result row will return the individual attribute value, which can then be adapted into any kind of return data structure.

      The example below illustrates replacing the usual Row return structure with a straight Python dictionary:

      1. from sqlalchemy.orm import Bundle
      2. class DictBundle(Bundle):
      3. def create_row_processor(self, query, procs, labels):
      4. 'Override create_row_processor to return values as
      5. dictionaries'
      6. def proc(row):
      7. return dict(
      8. zip(labels, (proc(row) for proc in procs))
      9. )
      10. return proc

      A result from the above Bundle will return dictionary values:

      1. bn = DictBundle('mybundle', MyClass.data1, MyClass.data2)
      2. for row in session.execute(select(bn)).where(bn.c.data1 == 'd1'):
      3. print(row.mybundle['data1'], row.mybundle['data2'])
  • attribute sqlalchemy.orm.CompositeProperty.columns_to_assign

  • method sqlalchemy.orm.CompositeProperty.declarative_scan(decl_scan: _ClassScanMapperConfig, registry: _RegistryType, cls: Type[Any], originating_module: Optional[str], key: str, mapped_container: Optional[Type[Mapped[Any]]], annotation: Optional[_AnnotationScanType], extracted_mapped_annotation: Optional[_AnnotationScanType], is_dataclass_field: bool) → None

    Perform class-specific initializaton at early declarative scanning time.

    New in version 2.0.

  • method sqlalchemy.orm.CompositeProperty.do_init() → None

    Initialization which occurs after the Composite has been associated with its parent mapper.

  • method sqlalchemy.orm.CompositeProperty.get_history(state: InstanceState[Any], dict\: _InstanceDict, _passive: PassiveFlag = symbol(‘PASSIVE_OFF’)) → History

    Provided for userland code that uses attributes.get_history().

  • method sqlalchemy.orm.CompositeProperty.instrument_class(mapper: Mapper[Any]) → None

    Hook called by the Mapper to the property to initiate instrumentation of the class attribute managed by this MapperProperty.

    The MapperProperty here will typically call out to the attributes module to set up an InstrumentedAttribute.

    This step is the first of two steps to set up an InstrumentedAttribute, and is called early in the mapper setup process.

    The second step is typically the init_class_attribute step, called from StrategizedProperty via the post_instrument_class() hook. This step assigns additional state to the InstrumentedAttribute (specifically the “impl”) which has been determined after the MapperProperty has determined what kind of persistence management it needs to do (e.g. scalar, object, collection, etc).

  • attribute sqlalchemy.orm.CompositeProperty.mapper_property_to_assign

class sqlalchemy.orm.AttributeEventToken

A token propagated throughout the course of a chain of attribute events.

Serves as an indicator of the source of the event and also provides a means of controlling propagation across a chain of attribute operations.

The Event object is sent as the initiator argument when dealing with events such as AttributeEvents.append(), AttributeEvents.set(), and AttributeEvents.remove().

The Event object is currently interpreted by the backref event handlers, and is used to control the propagation of operations across two mutually-dependent attributes.

Changed in version 2.0: Changed the name from AttributeEvent to AttributeEventToken.

  • Attribute impl:

    The AttributeImpl which is the current event initiator.

    Attribute op:

    The symbol OP_APPEND, OP_REMOVE, OP_REPLACE, or OP_BULK_REPLACE, indicating the source operation.

class sqlalchemy.orm.IdentityMap

Members

check_modified()

  • method sqlalchemy.orm.IdentityMap.check_modified() → bool

    return True if any InstanceStates present have been marked as ‘modified’.

class sqlalchemy.orm.InspectionAttr

A base class applied to all ORM objects and attributes that are related to things that can be returned by the inspect() function.

The attributes defined here allow the usage of simple boolean checks to test basic facts about the object returned.

Members

extension_type, is_aliased_class, is_attribute, is_bundle, is_clause_element, is_instance, is_mapper, is_property, is_selectable

While the boolean checks here are basically the same as using the Python isinstance() function, the flags here can be used without the need to import all of these classes, and also such that the SQLAlchemy class system can change while leaving the flags here intact for forwards-compatibility.

class sqlalchemy.orm.InspectionAttrInfo

Adds the .info attribute to InspectionAttr.

The rationale for InspectionAttr vs. InspectionAttrInfo is that the former is compatible as a mixin for classes that specify __slots__; this is essentially an implementation artifact.

Members

info

Class signature

class sqlalchemy.orm.InspectionAttrInfo (sqlalchemy.orm.base.InspectionAttr)

class sqlalchemy.orm.InstanceState

tracks state information at the instance level.

The InstanceState is a key object used by the SQLAlchemy ORM in order to track the state of an object; it is created the moment an object is instantiated, typically as a result of instrumentation which SQLAlchemy applies to the __init__() method of the class.

InstanceState is also a semi-public object, available for runtime inspection as to the state of a mapped instance, including information such as its current status within a particular Session and details about data on individual attributes. The public API in order to acquire a InstanceState object is to use the inspect() system:

  1. >>> from sqlalchemy import inspect
  2. >>> insp = inspect(some_mapped_object)
  3. >>> insp.attrs.nickname.history
  4. History(added=['new nickname'], unchanged=(), deleted=['nickname'])

See also

Inspection of Mapped Instances

Members

async_session, attrs, callables, deleted, detached, dict, expired_attributes, has_identity, identity, identity_key, is_instance, mapper, object, pending, persistent, session, transient, unloaded, unloaded_expirable, unmodified, unmodified_intersection(), was_deleted

Class signature

class sqlalchemy.orm.InstanceState (sqlalchemy.orm.base.InspectionAttrInfo, typing.Generic)

class sqlalchemy.orm.InstrumentedAttribute

Base class for descriptor objects that intercept attribute events on behalf of a MapperProperty object. The actual MapperProperty is accessible via the QueryableAttribute.property attribute.

See also

InstrumentedAttribute

MapperProperty

Mapper.all_orm_descriptors

Mapper.attrs

Class signature

class sqlalchemy.orm.InstrumentedAttribute (sqlalchemy.orm.QueryableAttribute)

class sqlalchemy.orm.LoaderCallableStatus

An enumeration.

Members

ATTR_EMPTY, ATTR_WAS_SET, NEVER_SET, NO_VALUE, PASSIVE_CLASS_MISMATCH, PASSIVE_NO_RESULT

Class signature

class sqlalchemy.orm.LoaderCallableStatus (enum.Enum)

  • attribute sqlalchemy.orm.LoaderCallableStatus.ATTR_EMPTY = 3

    Symbol used internally to indicate an attribute had no callable.

  • attribute sqlalchemy.orm.LoaderCallableStatus.ATTR_WAS_SET = 2

    Symbol returned by a loader callable to indicate the retrieved value, or values, were assigned to their attributes on the target object.

  • attribute sqlalchemy.orm.LoaderCallableStatus.NEVER_SET = 4

    Synonymous with NO_VALUE

    Changed in version 1.4: NEVER_SET was merged with NO_VALUE

  • attribute sqlalchemy.orm.LoaderCallableStatus.NO_VALUE = 4

    Symbol which may be placed as the ‘previous’ value of an attribute, indicating no value was loaded for an attribute when it was modified, and flags indicated we were not to load it.

  • attribute sqlalchemy.orm.LoaderCallableStatus.PASSIVE_CLASS_MISMATCH = 1

    Symbol indicating that an object is locally present for a given primary key identity but it is not of the requested class. The return value is therefore None and no SQL should be emitted.

  • attribute sqlalchemy.orm.LoaderCallableStatus.PASSIVE_NO_RESULT = 0

    Symbol returned by a loader callable or other attribute/history retrieval operation when a value could not be determined, based on loader callable flags.

class sqlalchemy.orm.Mapped

Represent an ORM mapped attribute on a mapped class.

This class represents the complete descriptor interface for any class attribute that will have been instrumented by the ORM Mapper class. Provides appropriate information to type checkers such as pylance and mypy so that ORM-mapped attributes are correctly typed.

The most prominent use of Mapped is in the Declarative Mapping form of Mapper configuration, where used explicitly it drives the configuration of ORM attributes such as mapped_class() and relationship().

See also

Using a Declarative Base Class

Declarative Table with mapped_column()

Tip

The Mapped class represents attributes that are handled directly by the Mapper class. It does not include other Python descriptor classes that are provided as extensions, including Hybrid Attributes and the Association Proxy. While these systems still make use of ORM-specific superclasses and structures, they are not instrumented by the Mapper and instead provide their own functionality when they are accessed on a class.

New in version 1.4.

Class signature

class sqlalchemy.orm.Mapped (sqlalchemy.orm.base.SQLORMExpression, sqlalchemy.orm.base.ORMDescriptor, sqlalchemy.orm.base._MappedAnnotationBase, sqlalchemy.sql.roles.DDLConstraintColumnRole)

class sqlalchemy.orm.MappedColumn

Maps a single Column on a class.

MappedColumn is a specialization of the ColumnProperty class and is oriented towards declarative configuration.

To construct MappedColumn objects, use the mapped_column() constructor function.

New in version 2.0.

Class signature

class sqlalchemy.orm.MappedColumn (sqlalchemy.orm._IntrospectsAnnotations, sqlalchemy.orm._MapsColumns, sqlalchemy.orm.base._DeclarativeMapped)

class sqlalchemy.orm.MapperProperty

Represent a particular class attribute mapped by Mapper.

The most common occurrences of MapperProperty are the mapped Column, which is represented in a mapping as an instance of ColumnProperty, and a reference to another class produced by relationship(), represented in the mapping as an instance of Relationship.

Members

cascade_iterator(), class_attribute, comparator, create_row_processor(), do_init(), doc, info, init(), instrument_class(), is_property, key, merge(), parent, post_instrument_class(), set_parent(), setup()

Class signature

class sqlalchemy.orm.MapperProperty (sqlalchemy.sql.cache_key.HasCacheKey, sqlalchemy.orm._DCAttributeOptions, sqlalchemy.orm.base._MappedAttribute, sqlalchemy.orm.base.InspectionAttrInfo, sqlalchemy.util.langhelpers.MemoizedSlots)

  • method sqlalchemy.orm.MapperProperty.cascade_iterator(type\: str, _state: InstanceState[Any], dict\: _InstanceDict, _visited_states: Set[InstanceState[Any]], halt_on: Optional[Callable[[InstanceState[Any]], bool]] = None) → Iterator[Tuple[object, Mapper[Any], InstanceState[Any], _InstanceDict]]

    Iterate through instances related to the given instance for a particular ‘cascade’, starting with this MapperProperty.

    Return an iterator3-tuples (instance, mapper, state).

    Note that the ‘cascade’ collection on this MapperProperty is checked first for the given type before cascade_iterator is called.

    This method typically only applies to Relationship.

  • attribute sqlalchemy.orm.MapperProperty.class_attribute

    Return the class-bound descriptor corresponding to this MapperProperty.

    This is basically a getattr() call:

    1. return getattr(self.parent.class_, self.key)

    I.e. if this MapperProperty were named addresses, and the class to which it is mapped is User, this sequence is possible:

    1. >>> from sqlalchemy import inspect
    2. >>> mapper = inspect(User)
    3. >>> addresses_property = mapper.attrs.addresses
    4. >>> addresses_property.class_attribute is User.addresses
    5. True
    6. >>> User.addresses.property is addresses_property
    7. True
  • attribute sqlalchemy.orm.MapperProperty.comparator: PropComparator[_T]

    The PropComparator instance that implements SQL expression construction on behalf of this mapped attribute.

  • method sqlalchemy.orm.MapperProperty.create_row_processor(context: ORMCompileState, query_entity: _MapperEntity, path: AbstractEntityRegistry, mapper: Mapper[Any], result: Result[Any], adapter: Optional[ORMAdapter], populators: _PopulatorDict) → None

    Produce row processing functions and append to the given set of populators lists.

  • method sqlalchemy.orm.MapperProperty.do_init() → None

    Perform subclass-specific initialization post-mapper-creation steps.

    This is a template method called by the MapperProperty object’s init() method.

  • attribute sqlalchemy.orm.MapperProperty.doc: Optional[str]

    optional documentation string

  • attribute sqlalchemy.orm.MapperProperty.info: _InfoType

    Info dictionary associated with the object, allowing user-defined data to be associated with this InspectionAttr.

    The dictionary is generated when first accessed. Alternatively, it can be specified as a constructor argument to the column_property(), relationship(), or composite() functions.

    Changed in version 1.0.0: InspectionAttr.info moved from MapperProperty so that it can apply to a wider variety of ORM and extension constructs.

    See also

    QueryableAttribute.info

    SchemaItem.info

  • method sqlalchemy.orm.MapperProperty.init() → None

    Called after all mappers are created to assemble relationships between mappers and perform other post-mapper-creation initialization steps.

  • method sqlalchemy.orm.MapperProperty.instrument_class(mapper: Mapper[Any]) → None

    Hook called by the Mapper to the property to initiate instrumentation of the class attribute managed by this MapperProperty.

    The MapperProperty here will typically call out to the attributes module to set up an InstrumentedAttribute.

    This step is the first of two steps to set up an InstrumentedAttribute, and is called early in the mapper setup process.

    The second step is typically the init_class_attribute step, called from StrategizedProperty via the post_instrument_class() hook. This step assigns additional state to the InstrumentedAttribute (specifically the “impl”) which has been determined after the MapperProperty has determined what kind of persistence management it needs to do (e.g. scalar, object, collection, etc).

  • attribute sqlalchemy.orm.MapperProperty.is_property = True

    Part of the InspectionAttr interface; states this object is a mapper property.

  • attribute sqlalchemy.orm.MapperProperty.key: str

    name of class attribute

  • method sqlalchemy.orm.MapperProperty.merge(session: Session, source_state: InstanceState[Any], source_dict: _InstanceDict, dest_state: InstanceState[Any], dest_dict: _InstanceDict, load: bool, _recursive: Dict[Any, object], _resolve_conflict_map: Dict[_IdentityKeyType[Any], object]) → None

    Merge the attribute represented by this MapperProperty from source to destination object.

  • attribute sqlalchemy.orm.MapperProperty.parent: Mapper[Any]

    the Mapper managing this property.

  • method sqlalchemy.orm.MapperProperty.post_instrument_class(mapper: Mapper[Any]) → None

    Perform instrumentation adjustments that need to occur after init() has completed.

    The given Mapper is the Mapper invoking the operation, which may not be the same Mapper as self.parent in an inheritance scenario; however, Mapper will always at least be a sub-mapper of self.parent.

    This method is typically used by StrategizedProperty, which delegates it to LoaderStrategy.init_class_attribute() to perform final setup on the class-bound InstrumentedAttribute.

  • method sqlalchemy.orm.MapperProperty.set_parent(parent: Mapper[Any], init: bool) → None

    Set the parent mapper that references this MapperProperty.

    This method is overridden by some subclasses to perform extra setup when the mapper is first known.

  • method sqlalchemy.orm.MapperProperty.setup(context: ORMCompileState, query_entity: _MapperEntity, path: AbstractEntityRegistry, adapter: Optional[ORMAdapter], **kwargs: Any) → None

    Called by Query for the purposes of constructing a SQL statement.

    Each MapperProperty associated with the target mapper processes the statement referenced by the query context, adding columns and/or criterion as appropriate.

class sqlalchemy.orm.MappedSQLExpression

Declarative front-end for the ColumnProperty class.

Public constructor is the column_property() function.

Changed in version 2.0: Added MappedSQLExpression as a Declarative compatible subclass for ColumnProperty.

See also

MappedColumn

Class signature

class sqlalchemy.orm.MappedSQLExpression (sqlalchemy.orm.properties.ColumnProperty, sqlalchemy.orm.base._DeclarativeMapped)

class sqlalchemy.orm.InspectionAttrExtensionType

Symbols indicating the type of extension that a InspectionAttr is part of.

Class signature

class sqlalchemy.orm.InspectionAttrExtensionType (enum.Enum)

class sqlalchemy.orm.NotExtension

An enumeration.

Members

NOT_EXTENSION

Class signature

class sqlalchemy.orm.NotExtension (sqlalchemy.orm.base.InspectionAttrExtensionType)

function sqlalchemy.orm.merge_result(query: Query[Any], iterator: Union[FrozenResult, Iterable[Sequence[Any]], Iterable[object]], load: bool = True) → Union[FrozenResult, Iterable[Any]]

Merge a result into the given Query object’s Session.

Deprecated since version 2.0: The merge_result() function is considered legacy as of the 1.x series of SQLAlchemy and becomes a legacy construct in 2.0. The function as well as the method on Query is superseded by the merge_frozen_result() function. (Background on SQLAlchemy 2.0 at: SQLAlchemy 2.0 - Major Migration Guide)

See Query.merge_result() for top-level documentation on this function.

function sqlalchemy.orm.merge_frozen_result(session, statement, frozen_result, load=True)

Merge a FrozenResult back into a Session, returning a new Result object with persistent objects.

See the section Re-Executing Statements for an example.

See also

Re-Executing Statements

Result.freeze()

FrozenResult

class sqlalchemy.orm.PropComparator

Defines SQL operations for ORM mapped attributes.

SQLAlchemy allows for operators to be redefined at both the Core and ORM level. PropComparator is the base class of operator redefinition for ORM-level operations, including those of ColumnProperty, Relationship, and Composite.

User-defined subclasses of PropComparator may be created. The built-in Python comparison and math operator methods, such as ColumnOperators.__eq__(), ColumnOperators.__lt__(), and ColumnOperators.__add__(), can be overridden to provide new operator behavior. The custom PropComparator is passed to the MapperProperty instance via the comparator_factory argument. In each case, the appropriate subclass of PropComparator should be used:

  1. # definition of custom PropComparator subclasses
  2. from sqlalchemy.orm.properties import \
  3. ColumnProperty,\
  4. Composite,\
  5. Relationship
  6. class MyColumnComparator(ColumnProperty.Comparator):
  7. def __eq__(self, other):
  8. return self.__clause_element__() == other
  9. class MyRelationshipComparator(Relationship.Comparator):
  10. def any(self, expression):
  11. "define the 'any' operation"
  12. # ...
  13. class MyCompositeComparator(Composite.Comparator):
  14. def __gt__(self, other):
  15. "redefine the 'greater than' operation"
  16. return sql.and_(*[a>b for a, b in
  17. zip(self.__clause_element__().clauses,
  18. other.__composite_values__())])
  19. # application of custom PropComparator subclasses
  20. from sqlalchemy.orm import column_property, relationship, composite
  21. from sqlalchemy import Column, String
  22. class SomeMappedClass(Base):
  23. some_column = column_property(Column("some_column", String),
  24. comparator_factory=MyColumnComparator)
  25. some_relationship = relationship(SomeOtherClass,
  26. comparator_factory=MyRelationshipComparator)
  27. some_composite = composite(
  28. Column("a", String), Column("b", String),
  29. comparator_factory=MyCompositeComparator
  30. )

Note that for column-level operator redefinition, it’s usually simpler to define the operators at the Core level, using the TypeEngine.comparator_factory attribute. See Redefining and Creating New Operators for more detail.

See also

Comparator

Comparator

Comparator

ColumnOperators

Redefining and Creating New Operators

TypeEngine.comparator_factory

Members

__eq__(), __le__(), __lt__(), __ne__(), adapt_to_entity(), adapter, all_(), and_(), any(), any_(), asc(), between(), bool_op(), collate(), concat(), contains(), desc(), distinct(), endswith(), has(), icontains(), iendswith(), ilike(), in_(), is_(), is_distinct_from(), is_not(), is_not_distinct_from(), isnot(), isnot_distinct_from(), istartswith(), like(), match(), not_ilike(), not_in(), not_like(), notilike(), notin_(), notlike(), nulls_first(), nulls_last(), nullsfirst(), nullslast(), of_type(), op(), operate(), property, regexp_match(), regexp_replace(), reverse_operate(), startswith(), timetuple

Class signature

class sqlalchemy.orm.PropComparator (sqlalchemy.orm.base.SQLORMOperations, typing.Generic, sqlalchemy.sql.expression.ColumnOperators)

  1. See also
  2. [ColumnOperators.startswith()]($aafca12b71ff5dd3.md#sqlalchemy.sql.expression.ColumnOperators.startswith "sqlalchemy.sql.expression.ColumnOperators.startswith")
  3. [ColumnOperators.endswith()]($aafca12b71ff5dd3.md#sqlalchemy.sql.expression.ColumnOperators.endswith "sqlalchemy.sql.expression.ColumnOperators.endswith")
  4. [ColumnOperators.like()]($aafca12b71ff5dd3.md#sqlalchemy.sql.expression.ColumnOperators.like "sqlalchemy.sql.expression.ColumnOperators.like")
  • method sqlalchemy.orm.PropComparator.desc() → ColumnOperators

    inherited from the ColumnOperators.desc() method of ColumnOperators

    Produce a desc() clause against the parent object.

  • method sqlalchemy.orm.PropComparator.distinct() → ColumnOperators

    inherited from the ColumnOperators.distinct() method of ColumnOperators

    Produce a distinct() clause against the parent object.

  • method sqlalchemy.orm.PropComparator.endswith(other: Any, escape: Optional[str] = None, autoescape: bool = False) → ColumnOperators

    inherited from the ColumnOperators.endswith() method of ColumnOperators

    Implement the ‘endswith’ operator.

    Produces a LIKE expression that tests against a match for the end of a string value:

    1. column LIKE '%' || <other>

    E.g.:

    1. stmt = select(sometable).\
    2. where(sometable.c.column.endswith("foobar"))

    Since the operator uses LIKE, wildcard characters "%" and "_" that are present inside the <other> expression will behave like wildcards as well. For literal string values, the ColumnOperators.endswith.autoescape flag may be set to True to apply escaping to occurrences of these characters within the string value so that they match as themselves and not as wildcard characters. Alternatively, the ColumnOperators.endswith.escape parameter will establish a given character as an escape character which can be of use when the target expression is not a literal string.

    • Parameters:

      • other – expression to be compared. This is usually a plain string value, but can also be an arbitrary SQL expression. LIKE wildcard characters % and _ are not escaped by default unless the ColumnOperators.endswith.autoescape flag is set to True.

      • autoescape

        boolean; when True, establishes an escape character within the LIKE expression, then applies it to all occurrences of "%", "_" and the escape character itself within the comparison value, which is assumed to be a literal string and not a SQL expression.

        An expression such as:

        1. somecolumn.endswith("foo%bar", autoescape=True)

        Will render as:

        1. somecolumn LIKE '%' || :param ESCAPE '/'

        With the value of :param as "foo/%bar".

      • escape

        a character which when given will render with the ESCAPE keyword to establish that character as the escape character. This character can then be placed preceding occurrences of % and _ to allow them to act as themselves and not wildcard characters.

        An expression such as:

        1. somecolumn.endswith("foo/%bar", escape="^")

        Will render as:

        1. somecolumn LIKE '%' || :param ESCAPE '^'

        The parameter may also be combined with ColumnOperators.endswith.autoescape:

        1. somecolumn.endswith("foo%bar^bat", escape="^", autoescape=True)

        Where above, the given literal parameter will be converted to "foo^%bar^^bat" before being passed to the database.

  1. See also
  2. [ColumnOperators.startswith()]($aafca12b71ff5dd3.md#sqlalchemy.sql.expression.ColumnOperators.startswith "sqlalchemy.sql.expression.ColumnOperators.startswith")
  3. [ColumnOperators.contains()]($aafca12b71ff5dd3.md#sqlalchemy.sql.expression.ColumnOperators.contains "sqlalchemy.sql.expression.ColumnOperators.contains")
  4. [ColumnOperators.like()]($aafca12b71ff5dd3.md#sqlalchemy.sql.expression.ColumnOperators.like "sqlalchemy.sql.expression.ColumnOperators.like")
  • method sqlalchemy.orm.PropComparator.has(criterion: Optional[_ColumnExpressionArgument[bool]] = None, **kwargs: Any) → ColumnElement[bool]

    Return a SQL expression representing true if this element references a member which meets the given criterion.

    The usual implementation of has() is Comparator.has().

    • Parameters:

      • criterion – an optional ClauseElement formulated against the member class’ table or attributes.

      • **kwargs – key/value pairs corresponding to member class attribute names which will be compared via equality to the corresponding values.

  • method sqlalchemy.orm.PropComparator.icontains(other: Any, **kw: Any) → ColumnOperators

    inherited from the ColumnOperators.icontains() method of ColumnOperators

    Implement the icontains operator, e.g. case insensitive version of ColumnOperators.contains().

    Produces a LIKE expression that tests against an insensitive match for the middle of a string value:

    1. lower(column) LIKE '%' || lower(<other>) || '%'

    E.g.:

    1. stmt = select(sometable).\
    2. where(sometable.c.column.icontains("foobar"))

    Since the operator uses LIKE, wildcard characters "%" and "_" that are present inside the <other> expression will behave like wildcards as well. For literal string values, the ColumnOperators.icontains.autoescape flag may be set to True to apply escaping to occurrences of these characters within the string value so that they match as themselves and not as wildcard characters. Alternatively, the ColumnOperators.icontains.escape parameter will establish a given character as an escape character which can be of use when the target expression is not a literal string.

    • Parameters:

      • other – expression to be compared. This is usually a plain string value, but can also be an arbitrary SQL expression. LIKE wildcard characters % and _ are not escaped by default unless the ColumnOperators.icontains.autoescape flag is set to True.

      • autoescape

        boolean; when True, establishes an escape character within the LIKE expression, then applies it to all occurrences of "%", "_" and the escape character itself within the comparison value, which is assumed to be a literal string and not a SQL expression.

        An expression such as:

        1. somecolumn.icontains("foo%bar", autoescape=True)

        Will render as:

        1. lower(somecolumn) LIKE '%' || lower(:param) || '%' ESCAPE '/'

        With the value of :param as "foo/%bar".

      • escape

        a character which when given will render with the ESCAPE keyword to establish that character as the escape character. This character can then be placed preceding occurrences of % and _ to allow them to act as themselves and not wildcard characters.

        An expression such as:

        1. somecolumn.icontains("foo/%bar", escape="^")

        Will render as:

        1. lower(somecolumn) LIKE '%' || lower(:param) || '%' ESCAPE '^'

        The parameter may also be combined with ColumnOperators.contains.autoescape:

        1. somecolumn.icontains("foo%bar^bat", escape="^", autoescape=True)

        Where above, the given literal parameter will be converted to "foo^%bar^^bat" before being passed to the database.

  1. See also
  2. [ColumnOperators.contains()]($aafca12b71ff5dd3.md#sqlalchemy.sql.expression.ColumnOperators.contains "sqlalchemy.sql.expression.ColumnOperators.contains")
  • method sqlalchemy.orm.PropComparator.iendswith(other: Any, escape: Optional[str] = None, autoescape: bool = False) → ColumnOperators

    inherited from the ColumnOperators.iendswith() method of ColumnOperators

    Implement the iendswith operator, e.g. case insensitive version of ColumnOperators.endswith().

    Produces a LIKE expression that tests against an insensitive match for the end of a string value:

    1. lower(column) LIKE '%' || lower(<other>)

    E.g.:

    1. stmt = select(sometable).\
    2. where(sometable.c.column.iendswith("foobar"))

    Since the operator uses LIKE, wildcard characters "%" and "_" that are present inside the <other> expression will behave like wildcards as well. For literal string values, the ColumnOperators.iendswith.autoescape flag may be set to True to apply escaping to occurrences of these characters within the string value so that they match as themselves and not as wildcard characters. Alternatively, the ColumnOperators.iendswith.escape parameter will establish a given character as an escape character which can be of use when the target expression is not a literal string.

    • Parameters:

      • other – expression to be compared. This is usually a plain string value, but can also be an arbitrary SQL expression. LIKE wildcard characters % and _ are not escaped by default unless the ColumnOperators.iendswith.autoescape flag is set to True.

      • autoescape

        boolean; when True, establishes an escape character within the LIKE expression, then applies it to all occurrences of "%", "_" and the escape character itself within the comparison value, which is assumed to be a literal string and not a SQL expression.

        An expression such as:

        1. somecolumn.iendswith("foo%bar", autoescape=True)

        Will render as:

        1. lower(somecolumn) LIKE '%' || lower(:param) ESCAPE '/'

        With the value of :param as "foo/%bar".

      • escape

        a character which when given will render with the ESCAPE keyword to establish that character as the escape character. This character can then be placed preceding occurrences of % and _ to allow them to act as themselves and not wildcard characters.

        An expression such as:

        1. somecolumn.iendswith("foo/%bar", escape="^")

        Will render as:

        1. lower(somecolumn) LIKE '%' || lower(:param) ESCAPE '^'

        The parameter may also be combined with ColumnOperators.iendswith.autoescape:

        1. somecolumn.endswith("foo%bar^bat", escape="^", autoescape=True)

        Where above, the given literal parameter will be converted to "foo^%bar^^bat" before being passed to the database.

  1. See also
  2. [ColumnOperators.endswith()]($aafca12b71ff5dd3.md#sqlalchemy.sql.expression.ColumnOperators.endswith "sqlalchemy.sql.expression.ColumnOperators.endswith")
  • method sqlalchemy.orm.PropComparator.ilike(other: Any, escape: Optional[str] = None) → ColumnOperators

    inherited from the ColumnOperators.ilike() method of ColumnOperators

    Implement the ilike operator, e.g. case insensitive LIKE.

    In a column context, produces an expression either of the form:

    1. lower(a) LIKE lower(other)

    Or on backends that support the ILIKE operator:

    1. a ILIKE other

    E.g.:

    1. stmt = select(sometable).\
    2. where(sometable.c.column.ilike("%foobar%"))
    • Parameters:

      • other – expression to be compared

      • escape

        optional escape character, renders the ESCAPE keyword, e.g.:

        1. somecolumn.ilike("foo/%bar", escape="/")
  1. See also
  2. [ColumnOperators.like()]($aafca12b71ff5dd3.md#sqlalchemy.sql.expression.ColumnOperators.like "sqlalchemy.sql.expression.ColumnOperators.like")
  • method sqlalchemy.orm.PropComparator.in_(other: Any) → ColumnOperators

    inherited from the ColumnOperators.in_() method of ColumnOperators

    Implement the in operator.

    In a column context, produces the clause column IN <other>.

    The given parameter other may be:

    • A list of literal values, e.g.:

      1. stmt.where(column.in_([1, 2, 3]))

      In this calling form, the list of items is converted to a set of bound parameters the same length as the list given:

      1. WHERE COL IN (?, ?, ?)
    • A list of tuples may be provided if the comparison is against a tuple_() containing multiple expressions:

      1. from sqlalchemy import tuple_
      2. stmt.where(tuple_(col1, col2).in_([(1, 10), (2, 20), (3, 30)]))
    • An empty list, e.g.:

      1. stmt.where(column.in_([]))

      In this calling form, the expression renders an “empty set” expression. These expressions are tailored to individual backends and are generally trying to get an empty SELECT statement as a subquery. Such as on SQLite, the expression is:

      1. WHERE col IN (SELECT 1 FROM (SELECT 1) WHERE 1!=1)

      Changed in version 1.4: empty IN expressions now use an execution-time generated SELECT subquery in all cases.

    • A bound parameter, e.g. bindparam(), may be used if it includes the bindparam.expanding flag:

      1. stmt.where(column.in_(bindparam('value', expanding=True)))

      In this calling form, the expression renders a special non-SQL placeholder expression that looks like:

      1. WHERE COL IN ([EXPANDING_value])

      This placeholder expression is intercepted at statement execution time to be converted into the variable number of bound parameter form illustrated earlier. If the statement were executed as:

      1. connection.execute(stmt, {"value": [1, 2, 3]})

      The database would be passed a bound parameter for each value:

      1. WHERE COL IN (?, ?, ?)

      New in version 1.2: added “expanding” bound parameters

      If an empty list is passed, a special “empty list” expression, which is specific to the database in use, is rendered. On SQLite this would be:

      1. WHERE COL IN (SELECT 1 FROM (SELECT 1) WHERE 1!=1)

      New in version 1.3: “expanding” bound parameters now support empty lists

    • a select() construct, which is usually a correlated scalar select:

      1. stmt.where(
      2. column.in_(
      3. select(othertable.c.y).
      4. where(table.c.x == othertable.c.x)
      5. )
      6. )

      In this calling form, ColumnOperators.in_() renders as given:

      1. WHERE COL IN (SELECT othertable.y
      2. FROM othertable WHERE othertable.x = table.x)
    • Parameters:

      other – a list of literals, a select() construct, or a bindparam() construct that includes the bindparam.expanding flag set to True.

  • method sqlalchemy.orm.PropComparator.is_(other: Any) → ColumnOperators

    inherited from the ColumnOperators.is_() method of ColumnOperators

    Implement the IS operator.

    Normally, IS is generated automatically when comparing to a value of None, which resolves to NULL. However, explicit usage of IS may be desirable if comparing to boolean values on certain platforms.

    See also

    ColumnOperators.is_not()

  • method sqlalchemy.orm.PropComparator.is_distinct_from(other: Any) → ColumnOperators

    inherited from the ColumnOperators.is_distinct_from() method of ColumnOperators

    Implement the IS DISTINCT FROM operator.

    Renders “a IS DISTINCT FROM b” on most platforms; on some such as SQLite may render “a IS NOT b”.

    New in version 1.1.

  • method sqlalchemy.orm.PropComparator.is_not(other: Any) → ColumnOperators

    inherited from the ColumnOperators.is_not() method of ColumnOperators

    Implement the IS NOT operator.

    Normally, IS NOT is generated automatically when comparing to a value of None, which resolves to NULL. However, explicit usage of IS NOT may be desirable if comparing to boolean values on certain platforms.

    Changed in version 1.4: The is_not() operator is renamed from isnot() in previous releases. The previous name remains available for backwards compatibility.

    See also

    ColumnOperators.is_()

  • method sqlalchemy.orm.PropComparator.is_not_distinct_from(other: Any) → ColumnOperators

    inherited from the ColumnOperators.is_not_distinct_from() method of ColumnOperators

    Implement the IS NOT DISTINCT FROM operator.

    Renders “a IS NOT DISTINCT FROM b” on most platforms; on some such as SQLite may render “a IS b”.

    Changed in version 1.4: The is_not_distinct_from() operator is renamed from isnot_distinct_from() in previous releases. The previous name remains available for backwards compatibility.

    New in version 1.1.

  • method sqlalchemy.orm.PropComparator.isnot(other: Any) → ColumnOperators

    inherited from the ColumnOperators.isnot() method of ColumnOperators

    Implement the IS NOT operator.

    Normally, IS NOT is generated automatically when comparing to a value of None, which resolves to NULL. However, explicit usage of IS NOT may be desirable if comparing to boolean values on certain platforms.

    Changed in version 1.4: The is_not() operator is renamed from isnot() in previous releases. The previous name remains available for backwards compatibility.

    See also

    ColumnOperators.is_()

  • method sqlalchemy.orm.PropComparator.isnot_distinct_from(other: Any) → ColumnOperators

    inherited from the ColumnOperators.isnot_distinct_from() method of ColumnOperators

    Implement the IS NOT DISTINCT FROM operator.

    Renders “a IS NOT DISTINCT FROM b” on most platforms; on some such as SQLite may render “a IS b”.

    Changed in version 1.4: The is_not_distinct_from() operator is renamed from isnot_distinct_from() in previous releases. The previous name remains available for backwards compatibility.

    New in version 1.1.

  • method sqlalchemy.orm.PropComparator.istartswith(other: Any, escape: Optional[str] = None, autoescape: bool = False) → ColumnOperators

    inherited from the ColumnOperators.istartswith() method of ColumnOperators

    Implement the istartswith operator, e.g. case insensitive version of ColumnOperators.startswith().

    Produces a LIKE expression that tests against an insensitive match for the start of a string value:

    1. lower(column) LIKE lower(<other>) || '%'

    E.g.:

    1. stmt = select(sometable).\
    2. where(sometable.c.column.istartswith("foobar"))

    Since the operator uses LIKE, wildcard characters "%" and "_" that are present inside the <other> expression will behave like wildcards as well. For literal string values, the ColumnOperators.istartswith.autoescape flag may be set to True to apply escaping to occurrences of these characters within the string value so that they match as themselves and not as wildcard characters. Alternatively, the ColumnOperators.istartswith.escape parameter will establish a given character as an escape character which can be of use when the target expression is not a literal string.

    • Parameters:

      • other – expression to be compared. This is usually a plain string value, but can also be an arbitrary SQL expression. LIKE wildcard characters % and _ are not escaped by default unless the ColumnOperators.istartswith.autoescape flag is set to True.

      • autoescape

        boolean; when True, establishes an escape character within the LIKE expression, then applies it to all occurrences of "%", "_" and the escape character itself within the comparison value, which is assumed to be a literal string and not a SQL expression.

        An expression such as:

        1. somecolumn.istartswith("foo%bar", autoescape=True)

        Will render as:

        1. lower(somecolumn) LIKE lower(:param) || '%' ESCAPE '/'

        With the value of :param as "foo/%bar".

      • escape

        a character which when given will render with the ESCAPE keyword to establish that character as the escape character. This character can then be placed preceding occurrences of % and _ to allow them to act as themselves and not wildcard characters.

        An expression such as:

        1. somecolumn.istartswith("foo/%bar", escape="^")

        Will render as:

        1. lower(somecolumn) LIKE lower(:param) || '%' ESCAPE '^'

        The parameter may also be combined with ColumnOperators.istartswith.autoescape:

        1. somecolumn.istartswith("foo%bar^bat", escape="^", autoescape=True)

        Where above, the given literal parameter will be converted to "foo^%bar^^bat" before being passed to the database.

  1. See also
  2. [ColumnOperators.startswith()]($aafca12b71ff5dd3.md#sqlalchemy.sql.expression.ColumnOperators.startswith "sqlalchemy.sql.expression.ColumnOperators.startswith")
  • method sqlalchemy.orm.PropComparator.like(other: Any, escape: Optional[str] = None) → ColumnOperators

    inherited from the ColumnOperators.like() method of ColumnOperators

    Implement the like operator.

    In a column context, produces the expression:

    1. a LIKE other

    E.g.:

    1. stmt = select(sometable).\
    2. where(sometable.c.column.like("%foobar%"))
    • Parameters:

      • other – expression to be compared

      • escape

        optional escape character, renders the ESCAPE keyword, e.g.:

        1. somecolumn.like("foo/%bar", escape="/")
  1. See also
  2. [ColumnOperators.ilike()]($aafca12b71ff5dd3.md#sqlalchemy.sql.expression.ColumnOperators.ilike "sqlalchemy.sql.expression.ColumnOperators.ilike")
  • method sqlalchemy.orm.PropComparator.match(other: Any, **kwargs: Any) → ColumnOperators

    inherited from the ColumnOperators.match() method of ColumnOperators

    Implements a database-specific ‘match’ operator.

    ColumnOperators.match() attempts to resolve to a MATCH-like function or operator provided by the backend. Examples include:

    • PostgreSQL - renders x @@ plainto_tsquery(y)

      Changed in version 2.0: plainto_tsquery() is used instead of to_tsquery() for PostgreSQL now; for compatibility with other forms, see Full Text Search.

    • MySQL - renders MATCH (x) AGAINST (y IN BOOLEAN MODE)

      See also

      match - MySQL specific construct with additional features.

    • Oracle - renders CONTAINS(x, y)

    • other backends may provide special implementations.

    • Backends without any special implementation will emit the operator as “MATCH”. This is compatible with SQLite, for example.

  • method sqlalchemy.orm.PropComparator.not_ilike(other: Any, escape: Optional[str] = None) → ColumnOperators

    inherited from the ColumnOperators.not_ilike() method of ColumnOperators

    implement the NOT ILIKE operator.

    This is equivalent to using negation with ColumnOperators.ilike(), i.e. ~x.ilike(y).

    Changed in version 1.4: The not_ilike() operator is renamed from notilike() in previous releases. The previous name remains available for backwards compatibility.

    See also

    ColumnOperators.ilike()

  • method sqlalchemy.orm.PropComparator.not_in(other: Any) → ColumnOperators

    inherited from the ColumnOperators.not_in() method of ColumnOperators

    implement the NOT IN operator.

    This is equivalent to using negation with ColumnOperators.in_(), i.e. ~x.in_(y).

    In the case that other is an empty sequence, the compiler produces an “empty not in” expression. This defaults to the expression “1 = 1” to produce true in all cases. The create_engine.empty_in_strategy may be used to alter this behavior.

    Changed in version 1.4: The not_in() operator is renamed from notin_() in previous releases. The previous name remains available for backwards compatibility.

    Changed in version 1.2: The ColumnOperators.in_() and ColumnOperators.not_in() operators now produce a “static” expression for an empty IN sequence by default.

    See also

    ColumnOperators.in_()

  • method sqlalchemy.orm.PropComparator.not_like(other: Any, escape: Optional[str] = None) → ColumnOperators

    inherited from the ColumnOperators.not_like() method of ColumnOperators

    implement the NOT LIKE operator.

    This is equivalent to using negation with ColumnOperators.like(), i.e. ~x.like(y).

    Changed in version 1.4: The not_like() operator is renamed from notlike() in previous releases. The previous name remains available for backwards compatibility.

    See also

    ColumnOperators.like()

  • method sqlalchemy.orm.PropComparator.notilike(other: Any, escape: Optional[str] = None) → ColumnOperators

    inherited from the ColumnOperators.notilike() method of ColumnOperators

    implement the NOT ILIKE operator.

    This is equivalent to using negation with ColumnOperators.ilike(), i.e. ~x.ilike(y).

    Changed in version 1.4: The not_ilike() operator is renamed from notilike() in previous releases. The previous name remains available for backwards compatibility.

    See also

    ColumnOperators.ilike()

  • method sqlalchemy.orm.PropComparator.notin_(other: Any) → ColumnOperators

    inherited from the ColumnOperators.notin_() method of ColumnOperators

    implement the NOT IN operator.

    This is equivalent to using negation with ColumnOperators.in_(), i.e. ~x.in_(y).

    In the case that other is an empty sequence, the compiler produces an “empty not in” expression. This defaults to the expression “1 = 1” to produce true in all cases. The create_engine.empty_in_strategy may be used to alter this behavior.

    Changed in version 1.4: The not_in() operator is renamed from notin_() in previous releases. The previous name remains available for backwards compatibility.

    Changed in version 1.2: The ColumnOperators.in_() and ColumnOperators.not_in() operators now produce a “static” expression for an empty IN sequence by default.

    See also

    ColumnOperators.in_()

  • method sqlalchemy.orm.PropComparator.notlike(other: Any, escape: Optional[str] = None) → ColumnOperators

    inherited from the ColumnOperators.notlike() method of ColumnOperators

    implement the NOT LIKE operator.

    This is equivalent to using negation with ColumnOperators.like(), i.e. ~x.like(y).

    Changed in version 1.4: The not_like() operator is renamed from notlike() in previous releases. The previous name remains available for backwards compatibility.

    See also

    ColumnOperators.like()

  • method sqlalchemy.orm.PropComparator.nulls_first() → ColumnOperators

    inherited from the ColumnOperators.nulls_first() method of ColumnOperators

    Produce a nulls_first() clause against the parent object.

    Changed in version 1.4: The nulls_first() operator is renamed from nullsfirst() in previous releases. The previous name remains available for backwards compatibility.

  • method sqlalchemy.orm.PropComparator.nulls_last() → ColumnOperators

    inherited from the ColumnOperators.nulls_last() method of ColumnOperators

    Produce a nulls_last() clause against the parent object.

    Changed in version 1.4: The nulls_last() operator is renamed from nullslast() in previous releases. The previous name remains available for backwards compatibility.

  • method sqlalchemy.orm.PropComparator.nullsfirst() → ColumnOperators

    inherited from the ColumnOperators.nullsfirst() method of ColumnOperators

    Produce a nulls_first() clause against the parent object.

    Changed in version 1.4: The nulls_first() operator is renamed from nullsfirst() in previous releases. The previous name remains available for backwards compatibility.

  • method sqlalchemy.orm.PropComparator.nullslast() → ColumnOperators

    inherited from the ColumnOperators.nullslast() method of ColumnOperators

    Produce a nulls_last() clause against the parent object.

    Changed in version 1.4: The nulls_last() operator is renamed from nullslast() in previous releases. The previous name remains available for backwards compatibility.

  • method sqlalchemy.orm.PropComparator.of_type(class\: _EntityType[Any]_) → PropComparator[_T]

    Redefine this object in terms of a polymorphic subclass, with_polymorphic() construct, or aliased() construct.

    Returns a new PropComparator from which further criterion can be evaluated.

    e.g.:

    1. query.join(Company.employees.of_type(Engineer)).\
    2. filter(Engineer.name=='foo')
    • Parameters:

      class_ – a class or mapper indicating that criterion will be against this specific subclass.

    See also

    Using Relationship to join between aliased targets - in the ORM Querying Guide

    Joining to specific sub-types or with_polymorphic() entities

  • method sqlalchemy.orm.PropComparator.op(opstring: str, precedence: int = 0, is_comparison: bool = False, return_type: Optional[Union[Type[TypeEngine[Any]], TypeEngine[Any]]] = None, python_impl: Optional[Callable[…, Any]] = None) → Callable[[Any], Operators]

    inherited from the Operators.op() method of Operators

    Produce a generic operator function.

    e.g.:

    1. somecolumn.op("*")(5)

    produces:

    1. somecolumn * 5

    This function can also be used to make bitwise operators explicit. For example:

    1. somecolumn.op('&')(0xff)

    is a bitwise AND of the value in somecolumn.

    • Parameters:

      • opstring – a string which will be output as the infix operator between this element and the expression passed to the generated function.

      • precedence

        precedence which the database is expected to apply to the operator in SQL expressions. This integer value acts as a hint for the SQL compiler to know when explicit parenthesis should be rendered around a particular operation. A lower number will cause the expression to be parenthesized when applied against another operator with higher precedence. The default value of 0 is lower than all operators except for the comma (,) and AS operators. A value of 100 will be higher or equal to all operators, and -100 will be lower than or equal to all operators.

        See also

        I’m using op() to generate a custom operator and my parenthesis are not coming out correctly - detailed description of how the SQLAlchemy SQL compiler renders parenthesis

      • is_comparison

        legacy; if True, the operator will be considered as a “comparison” operator, that is which evaluates to a boolean true/false value, like ==, >, etc. This flag is provided so that ORM relationships can establish that the operator is a comparison operator when used in a custom join condition.

        Using the is_comparison parameter is superseded by using the Operators.bool_op() method instead; this more succinct operator sets this parameter automatically, but also provides correct PEP 484 typing support as the returned object will express a “boolean” datatype, i.e. BinaryExpression[bool].

      • return_type – a TypeEngine class or object that will force the return type of an expression produced by this operator to be of that type. By default, operators that specify Operators.op.is_comparison will resolve to Boolean, and those that do not will be of the same type as the left-hand operand.

      • python_impl

        an optional Python function that can evaluate two Python values in the same way as this operator works when run on the database server. Useful for in-Python SQL expression evaluation functions, such as for ORM hybrid attributes, and the ORM “evaluator” used to match objects in a session after a multi-row update or delete.

        e.g.:

        1. >>> expr = column('x').op('+', python_impl=lambda a, b: a + b)('y')

        The operator for the above expression will also work for non-SQL left and right objects:

        1. >>> expr.operator(5, 10)
        2. 15

        New in version 2.0.

  1. See also
  2. [Operators.bool\_op()]($aafca12b71ff5dd3.md#sqlalchemy.sql.expression.Operators.bool_op "sqlalchemy.sql.expression.Operators.bool_op")
  3. [Redefining and Creating New Operators]($e8ad009010586d59.md#types-operators)
  4. [Using custom operators in join conditions]($b68ea79e4b407a37.md#relationship-custom-operator)
  • method sqlalchemy.orm.PropComparator.operate(op: OperatorType, *other: Any, **kwargs: Any) → Operators

    inherited from the Operators.operate() method of Operators

    Operate on an argument.

    This is the lowest level of operation, raises NotImplementedError by default.

    Overriding this on a subclass can allow common behavior to be applied to all operations. For example, overriding ColumnOperators to apply func.lower() to the left and right side:

    1. class MyComparator(ColumnOperators):
    2. def operate(self, op, other, **kwargs):
    3. return op(func.lower(self), func.lower(other), **kwargs)
    • Parameters:

      • op – Operator callable.

      • *other – the ‘other’ side of the operation. Will be a single scalar for most operations.

      • **kwargs – modifiers. These may be passed by special operators such as ColumnOperators.contains().

  • attribute sqlalchemy.orm.PropComparator.property

    Return the MapperProperty associated with this PropComparator.

    Return values here will commonly be instances of ColumnProperty or Relationship.

  • method sqlalchemy.orm.PropComparator.regexp_match(pattern: Any, flags: Optional[str] = None) → ColumnOperators

    inherited from the ColumnOperators.regexp_match() method of ColumnOperators

    Implements a database-specific ‘regexp match’ operator.

    E.g.:

    1. stmt = select(table.c.some_column).where(
    2. table.c.some_column.regexp_match('^(b|c)')
    3. )

    ColumnOperators.regexp_match() attempts to resolve to a REGEXP-like function or operator provided by the backend, however the specific regular expression syntax and flags available are not backend agnostic.

    Examples include:

    • PostgreSQL - renders x ~ y or x !~ y when negated.

    • Oracle - renders REGEXP_LIKE(x, y)

    • SQLite - uses SQLite’s REGEXP placeholder operator and calls into the Python re.match() builtin.

    • other backends may provide special implementations.

    • Backends without any special implementation will emit the operator as “REGEXP” or “NOT REGEXP”. This is compatible with SQLite and MySQL, for example.

    Regular expression support is currently implemented for Oracle, PostgreSQL, MySQL and MariaDB. Partial support is available for SQLite. Support among third-party dialects may vary.

    • Parameters:

      • pattern – The regular expression pattern string or column clause.

      • flags – Any regular expression string flags to apply. Flags tend to be backend specific. It can be a string or a column clause. Some backends, like PostgreSQL and MariaDB, may alternatively specify the flags as part of the pattern. When using the ignore case flag ‘i’ in PostgreSQL, the ignore case regexp match operator ~* or !~* will be used.

  1. New in version 1.4.
  2. See also
  3. [ColumnOperators.regexp\_replace()]($aafca12b71ff5dd3.md#sqlalchemy.sql.expression.ColumnOperators.regexp_replace "sqlalchemy.sql.expression.ColumnOperators.regexp_replace")
  • method sqlalchemy.orm.PropComparator.regexp_replace(pattern: Any, replacement: Any, flags: Optional[str] = None) → ColumnOperators

    inherited from the ColumnOperators.regexp_replace() method of ColumnOperators

    Implements a database-specific ‘regexp replace’ operator.

    E.g.:

    1. stmt = select(
    2. table.c.some_column.regexp_replace(
    3. 'b(..)',
    4. 'XY',
    5. flags='g'
    6. )
    7. )

    ColumnOperators.regexp_replace() attempts to resolve to a REGEXP_REPLACE-like function provided by the backend, that usually emit the function REGEXP_REPLACE(). However, the specific regular expression syntax and flags available are not backend agnostic.

    Regular expression replacement support is currently implemented for Oracle, PostgreSQL, MySQL 8 or greater and MariaDB. Support among third-party dialects may vary.

    • Parameters:

      • pattern – The regular expression pattern string or column clause.

      • pattern – The replacement string or column clause.

      • flags – Any regular expression string flags to apply. Flags tend to be backend specific. It can be a string or a column clause. Some backends, like PostgreSQL and MariaDB, may alternatively specify the flags as part of the pattern.

  1. New in version 1.4.
  2. See also
  3. [ColumnOperators.regexp\_match()]($aafca12b71ff5dd3.md#sqlalchemy.sql.expression.ColumnOperators.regexp_match "sqlalchemy.sql.expression.ColumnOperators.regexp_match")
  • method sqlalchemy.orm.PropComparator.reverse_operate(op: OperatorType, other: Any, **kwargs: Any) → Operators

    inherited from the Operators.reverse_operate() method of Operators

    Reverse operate on an argument.

    Usage is the same as operate().

  • method sqlalchemy.orm.PropComparator.startswith(other: Any, escape: Optional[str] = None, autoescape: bool = False) → ColumnOperators

    inherited from the ColumnOperators.startswith() method of ColumnOperators

    Implement the startswith operator.

    Produces a LIKE expression that tests against a match for the start of a string value:

    1. column LIKE <other> || '%'

    E.g.:

    1. stmt = select(sometable).\
    2. where(sometable.c.column.startswith("foobar"))

    Since the operator uses LIKE, wildcard characters "%" and "_" that are present inside the <other> expression will behave like wildcards as well. For literal string values, the ColumnOperators.startswith.autoescape flag may be set to True to apply escaping to occurrences of these characters within the string value so that they match as themselves and not as wildcard characters. Alternatively, the ColumnOperators.startswith.escape parameter will establish a given character as an escape character which can be of use when the target expression is not a literal string.

    • Parameters:

      • other – expression to be compared. This is usually a plain string value, but can also be an arbitrary SQL expression. LIKE wildcard characters % and _ are not escaped by default unless the ColumnOperators.startswith.autoescape flag is set to True.

      • autoescape

        boolean; when True, establishes an escape character within the LIKE expression, then applies it to all occurrences of "%", "_" and the escape character itself within the comparison value, which is assumed to be a literal string and not a SQL expression.

        An expression such as:

        1. somecolumn.startswith("foo%bar", autoescape=True)

        Will render as:

        1. somecolumn LIKE :param || '%' ESCAPE '/'

        With the value of :param as "foo/%bar".

      • escape

        a character which when given will render with the ESCAPE keyword to establish that character as the escape character. This character can then be placed preceding occurrences of % and _ to allow them to act as themselves and not wildcard characters.

        An expression such as:

        1. somecolumn.startswith("foo/%bar", escape="^")

        Will render as:

        1. somecolumn LIKE :param || '%' ESCAPE '^'

        The parameter may also be combined with ColumnOperators.startswith.autoescape:

        1. somecolumn.startswith("foo%bar^bat", escape="^", autoescape=True)

        Where above, the given literal parameter will be converted to "foo^%bar^^bat" before being passed to the database.

  1. See also
  2. [ColumnOperators.endswith()]($aafca12b71ff5dd3.md#sqlalchemy.sql.expression.ColumnOperators.endswith "sqlalchemy.sql.expression.ColumnOperators.endswith")
  3. [ColumnOperators.contains()]($aafca12b71ff5dd3.md#sqlalchemy.sql.expression.ColumnOperators.contains "sqlalchemy.sql.expression.ColumnOperators.contains")
  4. [ColumnOperators.like()]($aafca12b71ff5dd3.md#sqlalchemy.sql.expression.ColumnOperators.like "sqlalchemy.sql.expression.ColumnOperators.like")

class sqlalchemy.orm.Relationship

Describes an object property that holds a single item or list of items that correspond to a related database table.

Public constructor is the relationship() function.

See also

Relationship Configuration

Changed in version 2.0: Added Relationship as a Declarative compatible subclass for RelationshipProperty.

Class signature

class sqlalchemy.orm.Relationship (sqlalchemy.orm.RelationshipProperty, sqlalchemy.orm.base._DeclarativeMapped, sqlalchemy.orm.base.WriteOnlyMapped, sqlalchemy.orm.base.DynamicMapped)

class sqlalchemy.orm.RelationshipDirection

enumeration which indicates the ‘direction’ of a RelationshipProperty.

RelationshipDirection is accessible from the Relationship.direction attribute of RelationshipProperty.

Members

MANYTOMANY, MANYTOONE, ONETOMANY

Class signature

class sqlalchemy.orm.RelationshipDirection (enum.Enum)

class sqlalchemy.orm.RelationshipProperty

Describes an object property that holds a single item or list of items that correspond to a related database table.

Public constructor is the relationship() function.

See also

Relationship Configuration

Members

__eq__(), __init__(), __ne__(), adapt_to_entity(), and_(), any(), contains(), entity, has(), in_(), mapper, of_type(), cascade, cascade_iterator(), declarative_scan(), do_init(), entity, instrument_class(), mapper, merge()

Class signature

class sqlalchemy.orm.RelationshipProperty (sqlalchemy.orm._IntrospectsAnnotations, sqlalchemy.orm.StrategizedProperty, sqlalchemy.log.Identified)

  • class Comparator

    Produce boolean, comparison, and other operators for RelationshipProperty attributes.

    See the documentation for PropComparator for a brief overview of ORM level operator definition.

    See also

    PropComparator

    Comparator

    ColumnOperators

    Redefining and Creating New Operators

    TypeEngine.comparator_factory

    Class signature

    class sqlalchemy.orm.RelationshipProperty.Comparator (sqlalchemy.util.langhelpers.MemoizedSlots, sqlalchemy.orm.PropComparator)

    • method sqlalchemy.orm.RelationshipProperty.Comparator.__eq__(other: Any) → ColumnElement[bool]

      Implement the == operator.

      In a many-to-one context, such as:

      1. MyClass.some_prop == <some object>

      this will typically produce a clause such as:

      1. mytable.related_id == <some id>

      Where <some id> is the primary key of the given object.

      The == operator provides partial functionality for non- many-to-one comparisons:

      • Comparisons against collections are not supported. Use Comparator.contains().

      • Compared to a scalar one-to-many, will produce a clause that compares the target columns in the parent to the given target.

      • Compared to a scalar many-to-many, an alias of the association table will be rendered as well, forming a natural join that is part of the main body of the query. This will not work for queries that go beyond simple AND conjunctions of comparisons, such as those which use OR. Use explicit joins, outerjoins, or Comparator.has() for more comprehensive non-many-to-one scalar membership tests.

      • Comparisons against None given in a one-to-many or many-to-many context produce a NOT EXISTS clause.

    • method sqlalchemy.orm.RelationshipProperty.Comparator.__init__(prop: RelationshipProperty[_PT], parentmapper: _InternalEntityType[Any], adapt_to_entity: Optional[AliasedInsp[Any]] = None, of_type: Optional[_EntityType[_PT]] = None, extra_criteria: Tuple[ColumnElement[bool], …] = ())

      Construction of Comparator is internal to the ORM’s attribute mechanics.

    • method sqlalchemy.orm.RelationshipProperty.Comparator.__ne__(other: Any) → ColumnElement[bool]

      Implement the != operator.

      In a many-to-one context, such as:

      1. MyClass.some_prop != <some object>

      This will typically produce a clause such as:

      1. mytable.related_id != <some id>

      Where <some id> is the primary key of the given object.

      The != operator provides partial functionality for non- many-to-one comparisons:

      • Comparisons against collections are not supported. Use Comparator.contains() in conjunction with not_().

      • Compared to a scalar one-to-many, will produce a clause that compares the target columns in the parent to the given target.

      • Compared to a scalar many-to-many, an alias of the association table will be rendered as well, forming a natural join that is part of the main body of the query. This will not work for queries that go beyond simple AND conjunctions of comparisons, such as those which use OR. Use explicit joins, outerjoins, or Comparator.has() in conjunction with not_() for more comprehensive non-many-to-one scalar membership tests.

      • Comparisons against None given in a one-to-many or many-to-many context produce an EXISTS clause.

    • method sqlalchemy.orm.RelationshipProperty.Comparator.adapt_to_entity(adapt_to_entity: AliasedInsp[Any]) → RelationshipProperty.Comparator[Any]

      Return a copy of this PropComparator which will use the given AliasedInsp to produce corresponding expressions.

    • method sqlalchemy.orm.RelationshipProperty.Comparator.and_(*criteria: _ColumnExpressionArgument[bool]) → PropComparator[Any]

      Add AND criteria.

      See PropComparator.and_() for an example.

      New in version 1.4.

    • method sqlalchemy.orm.RelationshipProperty.Comparator.any(criterion: Optional[_ColumnExpressionArgument[bool]] = None, **kwargs: Any) → ColumnElement[bool]

      Produce an expression that tests a collection against particular criterion, using EXISTS.

      An expression like:

      1. session.query(MyClass).filter(
      2. MyClass.somereference.any(SomeRelated.x==2)
      3. )

      Will produce a query like:

      1. SELECT * FROM my_table WHERE
      2. EXISTS (SELECT 1 FROM related WHERE related.my_id=my_table.id
      3. AND related.x=2)

      Because Comparator.any() uses a correlated subquery, its performance is not nearly as good when compared against large target tables as that of using a join.

      Comparator.any() is particularly useful for testing for empty collections:

      1. session.query(MyClass).filter(
      2. ~MyClass.somereference.any()
      3. )

      will produce:

      1. SELECT * FROM my_table WHERE
      2. NOT (EXISTS (SELECT 1 FROM related WHERE
      3. related.my_id=my_table.id))

      Comparator.any() is only valid for collections, i.e. a relationship() that has uselist=True. For scalar references, use Comparator.has().

    • method sqlalchemy.orm.RelationshipProperty.Comparator.contains(other: _ColumnExpressionArgument[Any], **kwargs: Any) → ColumnElement[bool]

      Return a simple expression that tests a collection for containment of a particular item.

      Comparator.contains() is only valid for a collection, i.e. a relationship() that implements one-to-many or many-to-many with uselist=True.

      When used in a simple one-to-many context, an expression like:

      1. MyClass.contains(other)

      Produces a clause like:

      1. mytable.id == <some id>

      Where <some id> is the value of the foreign key attribute on other which refers to the primary key of its parent object. From this it follows that Comparator.contains() is very useful when used with simple one-to-many operations.

      For many-to-many operations, the behavior of Comparator.contains() has more caveats. The association table will be rendered in the statement, producing an “implicit” join, that is, includes multiple tables in the FROM clause which are equated in the WHERE clause:

      1. query(MyClass).filter(MyClass.contains(other))

      Produces a query like:

      1. SELECT * FROM my_table, my_association_table AS
      2. my_association_table_1 WHERE
      3. my_table.id = my_association_table_1.parent_id
      4. AND my_association_table_1.child_id = <some id>

      Where <some id> would be the primary key of other. From the above, it is clear that Comparator.contains() will not work with many-to-many collections when used in queries that move beyond simple AND conjunctions, such as multiple Comparator.contains() expressions joined by OR. In such cases subqueries or explicit “outer joins” will need to be used instead. See Comparator.any() for a less-performant alternative using EXISTS, or refer to Query.outerjoin() as well as Joins for more details on constructing outer joins.

      kwargs may be ignored by this operator but are required for API conformance.

    • attribute sqlalchemy.orm.RelationshipProperty.Comparator.entity: _InternalEntityType[_PT]

      The target entity referred to by this Comparator.

      This is either a Mapper or AliasedInsp object.

      This is the “target” or “remote” side of the relationship().

    • method sqlalchemy.orm.RelationshipProperty.Comparator.has(criterion: Optional[_ColumnExpressionArgument[bool]] = None, **kwargs: Any) → ColumnElement[bool]

      Produce an expression that tests a scalar reference against particular criterion, using EXISTS.

      An expression like:

      1. session.query(MyClass).filter(
      2. MyClass.somereference.has(SomeRelated.x==2)
      3. )

      Will produce a query like:

      1. SELECT * FROM my_table WHERE
      2. EXISTS (SELECT 1 FROM related WHERE
      3. related.id==my_table.related_id AND related.x=2)

      Because Comparator.has() uses a correlated subquery, its performance is not nearly as good when compared against large target tables as that of using a join.

      Comparator.has() is only valid for scalar references, i.e. a relationship() that has uselist=False. For collection references, use Comparator.any().

    • method sqlalchemy.orm.RelationshipProperty.Comparator.in_(other: Any) → NoReturn

      Produce an IN clause - this is not implemented for relationship()-based attributes at this time.

    • attribute sqlalchemy.orm.RelationshipProperty.Comparator.mapper: Mapper[_PT]

      The target Mapper referred to by this Comparator.

      This is the “target” or “remote” side of the relationship().

    • method sqlalchemy.orm.RelationshipProperty.Comparator.of_type(class\: _EntityType[Any]_) → PropComparator[_PT]

      Redefine this object in terms of a polymorphic subclass.

      See PropComparator.of_type() for an example.

  • attribute sqlalchemy.orm.RelationshipProperty.cascade

    Return the current cascade setting for this RelationshipProperty.

  • method sqlalchemy.orm.RelationshipProperty.cascade_iterator(type\: str, _state: InstanceState[Any], dict\: _InstanceDict, _visited_states: Set[InstanceState[Any]], halt_on: Optional[Callable[[InstanceState[Any]], bool]] = None) → Iterator[Tuple[Any, Mapper[Any], InstanceState[Any], _InstanceDict]]

    Iterate through instances related to the given instance for a particular ‘cascade’, starting with this MapperProperty.

    Return an iterator3-tuples (instance, mapper, state).

    Note that the ‘cascade’ collection on this MapperProperty is checked first for the given type before cascade_iterator is called.

    This method typically only applies to Relationship.

  • method sqlalchemy.orm.RelationshipProperty.declarative_scan(decl_scan: _ClassScanMapperConfig, registry: _RegistryType, cls: Type[Any], originating_module: Optional[str], key: str, mapped_container: Optional[Type[Mapped[Any]]], annotation: Optional[_AnnotationScanType], extracted_mapped_annotation: Optional[_AnnotationScanType], is_dataclass_field: bool) → None

    Perform class-specific initializaton at early declarative scanning time.

    New in version 2.0.

  • method sqlalchemy.orm.RelationshipProperty.do_init() → None

    Perform subclass-specific initialization post-mapper-creation steps.

    This is a template method called by the MapperProperty object’s init() method.

  • attribute sqlalchemy.orm.RelationshipProperty.entity

    Return the target mapped entity, which is an inspect() of the class or aliased class that is referred towards.

  • method sqlalchemy.orm.RelationshipProperty.instrument_class(mapper: Mapper[Any]) → None

    Hook called by the Mapper to the property to initiate instrumentation of the class attribute managed by this MapperProperty.

    The MapperProperty here will typically call out to the attributes module to set up an InstrumentedAttribute.

    This step is the first of two steps to set up an InstrumentedAttribute, and is called early in the mapper setup process.

    The second step is typically the init_class_attribute step, called from StrategizedProperty via the post_instrument_class() hook. This step assigns additional state to the InstrumentedAttribute (specifically the “impl”) which has been determined after the MapperProperty has determined what kind of persistence management it needs to do (e.g. scalar, object, collection, etc).

  • attribute sqlalchemy.orm.RelationshipProperty.mapper

    Return the targeted Mapper for this RelationshipProperty.

  • method sqlalchemy.orm.RelationshipProperty.merge(session: Session, source_state: InstanceState[Any], source_dict: _InstanceDict, dest_state: InstanceState[Any], dest_dict: _InstanceDict, load: bool, _recursive: Dict[Any, object], _resolve_conflict_map: Dict[_IdentityKeyType[Any], object]) → None

    Merge the attribute represented by this MapperProperty from source to destination object.

class sqlalchemy.orm.SQLORMExpression

A type that may be used to indicate any ORM-level attribute or object that acts in place of one, in the context of SQL expression construction.

SQLORMExpression extends from the Core SQLColumnExpression to add additional SQL methods that are ORM specific, such as PropComparator.of_type(), and is part of the bases for InstrumentedAttribute. It may be used in PEP 484 typing to indicate arguments or return values that should behave as ORM-level attribute expressions.

New in version 2.0.0b4.

Class signature

class sqlalchemy.orm.SQLORMExpression (sqlalchemy.orm.base.SQLORMOperations, sqlalchemy.sql.expression.SQLColumnExpression, sqlalchemy.util.langhelpers.TypingOnly)

class sqlalchemy.orm.Synonym

Declarative front-end for the SynonymProperty class.

Public constructor is the synonym() function.

Changed in version 2.0: Added Synonym as a Declarative compatible subclass for SynonymProperty

See also

Synonyms - Overview of synonyms

Class signature

class sqlalchemy.orm.Synonym (sqlalchemy.orm.descriptor_props.SynonymProperty, sqlalchemy.orm.base._DeclarativeMapped)

class sqlalchemy.orm.SynonymProperty

Denote an attribute name as a synonym to a mapped property, in that the attribute will mirror the value and expression behavior of another attribute.

Synonym is constructed using the synonym() function.

See also

Synonyms - Overview of synonyms

Members

doc, info, key, parent, set_parent(), uses_objects

Class signature

class sqlalchemy.orm.SynonymProperty (sqlalchemy.orm.descriptor_props.DescriptorProperty)

class sqlalchemy.orm.QueryContext

class sqlalchemy.orm.QueryableAttribute

Base class for descriptor objects that intercept attribute events on behalf of a MapperProperty object. The actual MapperProperty is accessible via the QueryableAttribute.property attribute.

See also

InstrumentedAttribute

MapperProperty

Mapper.all_orm_descriptors

Mapper.attrs

Members

adapt_to_entity(), and_(), expression, info, is_attribute, of_type(), operate(), parent, reverse_operate()

Class signature

class sqlalchemy.orm.QueryableAttribute (sqlalchemy.orm.base._DeclarativeMapped, sqlalchemy.orm.base.SQLORMExpression, sqlalchemy.orm.base.InspectionAttr, sqlalchemy.orm.PropComparator, sqlalchemy.sql.roles.JoinTargetRole, sqlalchemy.sql.roles.OnClauseRole, sqlalchemy.sql.expression.Immutable, sqlalchemy.sql.cache_key.SlotsMemoizedHasCacheKey, sqlalchemy.util.langhelpers.MemoizedSlots, sqlalchemy.event.registry.EventTarget)

class sqlalchemy.orm.UOWTransaction

  • method sqlalchemy.orm.UOWTransaction.filter_states_for_dep(dep, states)

    Filter the given list of InstanceStates to those relevant to the given DependencyProcessor.

  • method sqlalchemy.orm.UOWTransaction.finalize_flush_changes() → None

    Mark processed objects as clean / deleted after a successful flush().

    This method is called within the flush() method after the execute() method has succeeded and the transaction has been committed.

  • method sqlalchemy.orm.UOWTransaction.get_attribute_history(state, key, passive=symbol(‘PASSIVE_NO_INITIALIZE’))

    Facade to attributes.get_state_history(), including caching of results.

  • method sqlalchemy.orm.UOWTransaction.is_deleted(state)

    Return True if the given state is marked as deleted within this uowtransaction.

  • method sqlalchemy.orm.UOWTransaction.remove_state_actions(state)

    Remove pending actions for a state from the uowtransaction.

Members

filter_states_for_dep(), finalize_flush_changes(), get_attribute_history(), is_deleted(), remove_state_actions(), was_already_deleted()