diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2022-05-06 16:09:52 -0400 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2022-05-15 21:57:01 -0400 |
| commit | 18a73fb1d1c267842ead5dacd05a49f4344d8b22 (patch) | |
| tree | cdd1144c7661b13bc4ada83912800f91055b466d /lib/sqlalchemy/ext/declarative | |
| parent | 257de6ebe15d3076e19f05f93c5b3c7fae25a4d3 (diff) | |
| download | sqlalchemy-18a73fb1d1c267842ead5dacd05a49f4344d8b22.tar.gz | |
revenge of pep 484
trying to get remaining must-haves for ORM
Change-Id: I66a3ecbbb8e5ba37c818c8a92737b576ecf012f7
Diffstat (limited to 'lib/sqlalchemy/ext/declarative')
| -rw-r--r-- | lib/sqlalchemy/ext/declarative/extensions.py | 36 |
1 files changed, 24 insertions, 12 deletions
diff --git a/lib/sqlalchemy/ext/declarative/extensions.py b/lib/sqlalchemy/ext/declarative/extensions.py index 9faf2ed51..22fa83c58 100644 --- a/lib/sqlalchemy/ext/declarative/extensions.py +++ b/lib/sqlalchemy/ext/declarative/extensions.py @@ -8,7 +8,10 @@ """Public API functions and helpers for declarative.""" +from __future__ import annotations +from typing import Callable +from typing import TYPE_CHECKING from ... import inspection from ...orm import exc as orm_exc @@ -20,6 +23,10 @@ from ...orm.util import polymorphic_union from ...schema import Table from ...util import OrderedDict +if TYPE_CHECKING: + from ...engine.reflection import Inspector + from ...sql.schema import MetaData + class ConcreteBase: """A helper class for 'concrete' declarative mappings. @@ -380,31 +387,36 @@ class DeferredReflection: mapper = thingy.cls.__mapper__ metadata = mapper.class_.metadata for rel in mapper._props.values(): + if ( isinstance(rel, relationships.Relationship) - and rel.secondary is not None + and rel._init_args.secondary._is_populated() ): - if isinstance(rel.secondary, Table): - cls._reflect_table(rel.secondary, insp) - elif isinstance(rel.secondary, str): + + secondary_arg = rel._init_args.secondary + + if isinstance(secondary_arg.argument, Table): + cls._reflect_table(secondary_arg.argument, insp) + elif isinstance(secondary_arg.argument, str): _, resolve_arg = _resolver(rel.parent.class_, rel) - rel.secondary = resolve_arg(rel.secondary) - rel.secondary._resolvers += ( + resolver = resolve_arg( + secondary_arg.argument, True + ) + resolver._resolvers += ( cls._sa_deferred_table_resolver( insp, metadata ), ) - # controversy! do we resolve it here? or leave - # it deferred? I think doing it here is necessary - # so the connection does not leak. - rel.secondary = rel.secondary() + secondary_arg.argument = resolver() @classmethod - def _sa_deferred_table_resolver(cls, inspector, metadata): - def _resolve(key): + def _sa_deferred_table_resolver( + cls, inspector: Inspector, metadata: MetaData + ) -> Callable[[str], Table]: + def _resolve(key: str) -> Table: t1 = Table(key, metadata) cls._reflect_table(t1, inspector) return t1 |
