summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormike bayer <mike_mp@zzzcomputing.com>2020-09-28 13:54:25 +0000
committerGerrit Code Review <gerrit@bbpush.zzzcomputing.com>2020-09-28 13:54:25 +0000
commit019666a749ee2d2c941ea9244f5af64696fe8fc1 (patch)
tree4ad9a42bb2fde4ac851cd1d02606b7315330fadb
parent5edb931edad103df873c027b3fadcae8ec9aec4c (diff)
parentcda023bbe391d175c80c4d82196538b42575d937 (diff)
downloadsqlalchemy-019666a749ee2d2c941ea9244f5af64696fe8fc1.tar.gz
Merge "dont use uninstrument event to dispose registry entry"
-rw-r--r--lib/sqlalchemy/orm/__init__.py9
-rw-r--r--lib/sqlalchemy/orm/decl_api.py2
-rw-r--r--lib/sqlalchemy/orm/decl_base.py6
-rw-r--r--lib/sqlalchemy/orm/events.py5
-rw-r--r--lib/sqlalchemy/orm/mapper.py1
5 files changed, 14 insertions, 9 deletions
diff --git a/lib/sqlalchemy/orm/__init__.py b/lib/sqlalchemy/orm/__init__.py
index 13626fb21..7f2c61a05 100644
--- a/lib/sqlalchemy/orm/__init__.py
+++ b/lib/sqlalchemy/orm/__init__.py
@@ -253,8 +253,13 @@ def clear_mappers():
"""
with mapperlib._CONFIGURE_MUTEX:
while _mapper_registry:
- mapper, b = _mapper_registry.popitem()
- mapper.dispose()
+ try:
+ mapper, b = _mapper_registry.popitem()
+ except KeyError:
+ # weak registry, item could have been collected
+ pass
+ else:
+ mapper.dispose()
joinedload = strategy_options.joinedload._unbound_fn
diff --git a/lib/sqlalchemy/orm/decl_api.py b/lib/sqlalchemy/orm/decl_api.py
index 41cc88112..70fffa295 100644
--- a/lib/sqlalchemy/orm/decl_api.py
+++ b/lib/sqlalchemy/orm/decl_api.py
@@ -454,7 +454,7 @@ class registry(object):
self.metadata = lcl_metadata
self.constructor = constructor
- def _dispose_declarative_artifacts(self, cls):
+ def _dispose_cls(self, cls):
clsregistry.remove_class(cls.__name__, cls, self._class_registry)
def generate_base(
diff --git a/lib/sqlalchemy/orm/decl_base.py b/lib/sqlalchemy/orm/decl_base.py
index 644e4aff6..0e0c79b1f 100644
--- a/lib/sqlalchemy/orm/decl_base.py
+++ b/lib/sqlalchemy/orm/decl_base.py
@@ -189,12 +189,6 @@ class _MapperConfig(object):
init_method=registry.constructor,
)
- event.listen(
- cls_,
- "class_uninstrument",
- registry._dispose_declarative_artifacts,
- )
-
def set_cls_attribute(self, attrname, value):
manager = instrumentation.manager_of_class(self.cls)
diff --git a/lib/sqlalchemy/orm/events.py b/lib/sqlalchemy/orm/events.py
index 0349c445c..29a509cb9 100644
--- a/lib/sqlalchemy/orm/events.py
+++ b/lib/sqlalchemy/orm/events.py
@@ -67,6 +67,11 @@ class InstrumentationEvents(event.Events):
def listen(target_cls, *arg):
listen_cls = target()
+
+ # if weakref were collected, however this is not something
+ # that normally happens. it was occurring during test teardown
+ # between mapper/registry/instrumentation_manager, however this
+ # interaction was changed to not rely upon the event system.
if listen_cls is None:
return None
diff --git a/lib/sqlalchemy/orm/mapper.py b/lib/sqlalchemy/orm/mapper.py
index 821c8a3c8..296ddf385 100644
--- a/lib/sqlalchemy/orm/mapper.py
+++ b/lib/sqlalchemy/orm/mapper.py
@@ -1293,6 +1293,7 @@ class Mapper(
and self.class_manager.is_mapped
and self.class_manager.mapper is self
):
+ self.class_manager.registry._dispose_cls(self.class_)
instrumentation.unregister_class(self.class_)
def _configure_pks(self):