]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- Fixed bug in baked loader system where the systemwide monkeypatch
authorMike Bayer <mike_mp@zzzcomputing.com>
Wed, 16 Dec 2015 02:44:00 +0000 (21:44 -0500)
committerMike Bayer <mike_mp@zzzcomputing.com>
Wed, 16 Dec 2015 02:44:00 +0000 (21:44 -0500)
for setting up baked lazy loaders would interfere with other
loader strategies that rely on lazy loading as a fallback, e.g.
joined and subquery eager loaders, leading to ``IndexError``
exceptions at mapper configuration time.
fixes #3612

doc/build/changelog/changelog_10.rst
lib/sqlalchemy/ext/baked.py
lib/sqlalchemy/orm/interfaces.py
test/ext/test_baked.py

index ab261c615669775476747d99cd72854592241b0c..b9eae73e622723d64b1251cd06d601000ce80660 100644 (file)
 .. changelog::
     :version: 1.0.11
 
+    .. change::
+        :tags: bug, ext
+        :tickets: 3612
+        :versions: 1.1.0b1
+
+        Fixed bug in baked loader system where the systemwide monkeypatch
+        for setting up baked lazy loaders would interfere with other
+        loader strategies that rely on lazy loading as a fallback, e.g.
+        joined and subquery eager loaders, leading to ``IndexError``
+        exceptions at mapper configuration time.
+
     .. change::
         :tags: bug, orm
         :tickets: 3611
index eb0c36805eb5aee615fc0fb0275ef550170aa2c5..d255b5ee40b23ce7e2fd2be692794886572cb73b 100644 (file)
@@ -384,7 +384,6 @@ def bake_lazy_loaders():
     Python overhead for these operations.
 
     """
-    strategies.LazyLoader._strategy_keys[:] = []
     BakedLazyLoader._strategy_keys[:] = []
 
     properties.RelationshipProperty.strategy_for(
@@ -394,6 +393,8 @@ def bake_lazy_loaders():
     properties.RelationshipProperty.strategy_for(
         lazy="baked_select")(BakedLazyLoader)
 
+    strategies.LazyLoader._strategy_keys[:] = BakedLazyLoader._strategy_keys[:]
+
 
 def unbake_lazy_loaders():
     """Disable the use of baked queries for all lazyloaders systemwide.
index ed8f2733263d1addc031a9d323d274a3cb582370..e9ad75e31acaf08add6adda4397ee3669bf8b2e4 100644 (file)
@@ -493,7 +493,11 @@ class StrategizedProperty(MapperProperty):
             return strategy
 
     def _get_strategy_by_cls(self, cls):
-        return self._get_strategy(cls._strategy_keys[0])
+        try:
+            return self._get_strategy(cls._strategy_keys[0])
+        except IndexError:
+            import pdb
+            pdb.set_trace()
 
     def setup(
             self, context, entity, path, adapter, **kwargs):
index 740689d60b47882370a0c103d7c1607e02bd446b..8bfa58403e22bea9439ed6426308ef9db884903e 100644 (file)
@@ -717,6 +717,24 @@ class LazyLoaderTest(BakedTest):
                 u1._sa_instance_state
             )
 
+    def test_systemwide_loaders_loadable_via_lazyloader(self):
+        from sqlalchemy.orm import configure_mappers
+        from sqlalchemy.orm.strategies import LazyLoader
+
+        baked.bake_lazy_loaders()
+        try:
+            User, Address = self._o2m_fixture(lazy='joined')
+
+            configure_mappers()
+
+            is_(
+                User.addresses.property.
+                _get_strategy_by_cls(LazyLoader).__class__,
+                BakedLazyLoader
+            )
+        finally:
+            baked.unbake_lazy_loaders()
+
     def test_invocation_systemwide_loaders(self):
         baked.bake_lazy_loaders()
         try: