diff options
| author | mike bayer <mike_mp@zzzcomputing.com> | 2020-09-28 13:54:25 +0000 |
|---|---|---|
| committer | Gerrit Code Review <gerrit@bbpush.zzzcomputing.com> | 2020-09-28 13:54:25 +0000 |
| commit | 019666a749ee2d2c941ea9244f5af64696fe8fc1 (patch) | |
| tree | 4ad9a42bb2fde4ac851cd1d02606b7315330fadb | |
| parent | 5edb931edad103df873c027b3fadcae8ec9aec4c (diff) | |
| parent | cda023bbe391d175c80c4d82196538b42575d937 (diff) | |
| download | sqlalchemy-019666a749ee2d2c941ea9244f5af64696fe8fc1.tar.gz | |
Merge "dont use uninstrument event to dispose registry entry"
| -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): |
