From de7007e7cc6231b067df71ca79efee75f3317eae Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Tue, 18 Oct 2022 13:25:06 -0400 Subject: call super().__init_subclass__(); support GenericAlias Improved the :class:`.DeclarativeBase` class so that when combined with other mixins like :class:`.MappedAsDataclass`, the order of the classes may be in either order. Added support for mapped classes that are also ``Generic`` subclasses, to be specified as a ``GenericAlias`` object (e.g. ``MyClass[str]``) within statements and calls to :func:`_sa.inspect`. Fixes: #8665 Change-Id: I03063a28b0438a44b9e028fd9d45e8ce08bd18c4 --- lib/sqlalchemy/orm/decl_api.py | 2 +- lib/sqlalchemy/orm/util.py | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) (limited to 'lib/sqlalchemy') diff --git a/lib/sqlalchemy/orm/decl_api.py b/lib/sqlalchemy/orm/decl_api.py index 5724d53a2..a43b59a45 100644 --- a/lib/sqlalchemy/orm/decl_api.py +++ b/lib/sqlalchemy/orm/decl_api.py @@ -581,7 +581,6 @@ class MappedAsDataclass(metaclass=DCTransformDeclarative): match_args: Union[_NoArg, bool] = _NoArg.NO_ARG, kw_only: Union[_NoArg, bool] = _NoArg.NO_ARG, ) -> None: - apply_dc_transforms: _DataclassArguments = { "init": init, "repr": repr, @@ -696,6 +695,7 @@ class DeclarativeBase( _setup_declarative_base(cls) else: _as_declarative(cls._sa_registry, cls, cls.__dict__) + super().__init_subclass__() def _check_not_declarative(cls: Type[Any], base: Type[Any]) -> None: diff --git a/lib/sqlalchemy/orm/util.py b/lib/sqlalchemy/orm/util.py index 0f16df9c8..b9d1b50e7 100644 --- a/lib/sqlalchemy/orm/util.py +++ b/lib/sqlalchemy/orm/util.py @@ -79,6 +79,7 @@ from ..util.langhelpers import MemoizedSlots from ..util.typing import de_stringify_annotation from ..util.typing import is_origin_of_cls from ..util.typing import Literal +from ..util.typing import typing_get_origin if typing.TYPE_CHECKING: from ._typing import _EntityType @@ -1361,6 +1362,18 @@ def _inspect_mc( return mapper +GenericAlias = type(List[_T]) + + +@inspection._inspects(GenericAlias) +def _inspect_generic_alias( + class_: Type[_O], +) -> Optional[Mapper[_O]]: + + origin = cast("Type[_O]", typing_get_origin(class_)) + return _inspect_mc(origin) + + @inspection._self_inspects class Bundle( ORMColumnsClauseRole[_T], -- cgit v1.2.1