summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authormike bayer <mike_mp@zzzcomputing.com>2021-03-16 20:38:48 +0000
committerGerrit Code Review <gerrit@ci3.zzzcomputing.com>2021-03-16 20:38:48 +0000
commite1e0c7b08362c5ca9f178d292ce683a9ed7d5126 (patch)
tree140c1aa1a5eaa0934a167e91af7905d1169a6d55 /lib
parent65d27f9611f3603f4bbfa6c2efca20b9eb01cecd (diff)
parentd386552d11ea697463211c1499b2bee2f5548be7 (diff)
downloadsqlalchemy-e1e0c7b08362c5ca9f178d292ce683a9ed7d5126.tar.gz
Merge "Early-assign Base.registry to a private name"
Diffstat (limited to 'lib')
-rw-r--r--lib/sqlalchemy/orm/decl_api.py17
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):