diff options
| -rw-r--r-- | lib/sqlalchemy/orm/__init__.py | 9 | ||||
| -rw-r--r-- | lib/sqlalchemy/orm/decl_api.py | 2 | ||||
| -rw-r--r-- | lib/sqlalchemy/orm/decl_base.py | 6 | ||||
| -rw-r--r-- | lib/sqlalchemy/orm/events.py | 5 | ||||
| -rw-r--r-- | lib/sqlalchemy/orm/mapper.py | 1 |
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): |
