diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2022-10-18 13:25:06 -0400 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2022-10-19 08:00:35 -0400 |
| commit | de7007e7cc6231b067df71ca79efee75f3317eae (patch) | |
| tree | 2fb45141c586ee84a6f1c7f6106439350e5d5753 /lib/sqlalchemy | |
| parent | 974b1bd0fc40e11fc2886b5a9fc333feeeebf546 (diff) | |
| download | sqlalchemy-de7007e7cc6231b067df71ca79efee75f3317eae.tar.gz | |
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
Diffstat (limited to 'lib/sqlalchemy')
| -rw-r--r-- | lib/sqlalchemy/orm/decl_api.py | 2 | ||||
| -rw-r--r-- | lib/sqlalchemy/orm/util.py | 13 |
2 files changed, 14 insertions, 1 deletions
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], |
