diff options
| author | mike bayer <mike_mp@zzzcomputing.com> | 2021-03-16 20:38:48 +0000 |
|---|---|---|
| committer | Gerrit Code Review <gerrit@ci3.zzzcomputing.com> | 2021-03-16 20:38:48 +0000 |
| commit | e1e0c7b08362c5ca9f178d292ce683a9ed7d5126 (patch) | |
| tree | 140c1aa1a5eaa0934a167e91af7905d1169a6d55 /lib | |
| parent | 65d27f9611f3603f4bbfa6c2efca20b9eb01cecd (diff) | |
| parent | d386552d11ea697463211c1499b2bee2f5548be7 (diff) | |
| download | sqlalchemy-e1e0c7b08362c5ca9f178d292ce683a9ed7d5126.tar.gz | |
Merge "Early-assign Base.registry to a private name"
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/sqlalchemy/orm/decl_api.py | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/lib/sqlalchemy/orm/decl_api.py b/lib/sqlalchemy/orm/decl_api.py index 1166d307e..0266c973a 100644 --- a/lib/sqlalchemy/orm/decl_api.py +++ b/lib/sqlalchemy/orm/decl_api.py @@ -25,6 +25,7 @@ from .decl_base import _DeferredMapperConfig from .decl_base import _del_attribute from .decl_base import _mapper from .descriptor_props import SynonymProperty as _orm_synonym +from .. import exc from .. import inspection from .. import util from ..sql.schema import MetaData @@ -56,8 +57,22 @@ def has_inherited_table(cls): class DeclarativeMeta(type): def __init__(cls, classname, bases, dict_, **kw): + # early-consume registry from the initial declarative base, + # assign privately to not conflict with subclass attributes named + # "registry" + reg = getattr(cls, "_sa_registry", None) + if reg is None: + reg = dict_.get("registry", None) + if not isinstance(reg, registry): + raise exc.InvalidRequestError( + "Declarative base class has no 'registry' attribute, " + "or registry is not a sqlalchemy.orm.registry() object" + ) + else: + cls._sa_registry = reg + if not cls.__dict__.get("__abstract__", False): - _as_declarative(cls.registry, cls, cls.__dict__) + _as_declarative(reg, cls, dict_) type.__init__(cls, classname, bases, dict_) def __setattr__(cls, key, value): |
