summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/ext/baked.py
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2018-02-25 19:54:37 -0500
committerMike Bayer <mike_mp@zzzcomputing.com>2018-02-28 10:52:59 -0500
commit4a31c30fa5ebd6af0e72937b21b2e5ee79e12631 (patch)
tree289f52c9255b6406fb1cdc335c20c7e3b65e409d /lib/sqlalchemy/ext/baked.py
parenta10bc4fdaa8ff95a2b7930622cb76a1aa07806f1 (diff)
downloadsqlalchemy-4a31c30fa5ebd6af0e72937b21b2e5ee79e12631.tar.gz
Merge existing query params in baked lazy load
Fixed a long-standing regression that occurred in version 1.0, which prevented the use of a custom :class:`.MapperOption` that alters the _params of a :class:`.Query` object for a lazy load, since the lazy loader itself would overwrite those parameters. This applies to the "temporal range" example on the wiki. Note however that the :meth:`.Query.populate_existing` method is now required in order to rewrite the mapper options associated with an object already loaded in the identity map. Also, a custom defined :class:`.MapperOption` will now cause lazy loaders related to the target object to use a non-baked query by default unless the :meth:`.MapperOption._generate_cache_key` method is implemented. Fixed bug where the new :meth:`.baked.Result.with_post_criteria` method would not interact with a subquery-eager loader correctly, in that the "post criteria" would not be applied to embedded subquery eager loaders. This is related to :ticket:`4128` in that the post criteria feature is now used by the lazy loader. Change-Id: I899808734458e25a023142c2c5bb37cbed869479 Fixes: #4128
Diffstat (limited to 'lib/sqlalchemy/ext/baked.py')
-rw-r--r--lib/sqlalchemy/ext/baked.py11
1 files changed, 8 insertions, 3 deletions
diff --git a/lib/sqlalchemy/ext/baked.py b/lib/sqlalchemy/ext/baked.py
index 9d5704471..86eee831b 100644
--- a/lib/sqlalchemy/ext/baked.py
+++ b/lib/sqlalchemy/ext/baked.py
@@ -240,7 +240,8 @@ class BakedQuery(object):
baked_queries.append((k, bk._cache_key, v))
del context.attributes[k]
- def _unbake_subquery_loaders(self, session, context, params):
+ def _unbake_subquery_loaders(
+ self, session, context, params, post_criteria):
"""Retrieve subquery eager loaders stored by _bake_subquery_loaders
and turn them back into Result objects that will iterate just
like a Query object.
@@ -250,7 +251,10 @@ class BakedQuery(object):
bk = BakedQuery(self._bakery,
lambda sess, q=query: q.with_session(sess))
bk._cache_key = cache_key
- context.attributes[k] = bk.for_session(session).params(**params)
+ q = bk.for_session(session)
+ for fn in post_criteria:
+ q = fn(q)
+ context.attributes[k] = q.params(**params)
class Result(object):
@@ -329,7 +333,8 @@ class Result(object):
context.session = self.session
context.attributes = context.attributes.copy()
- bq._unbake_subquery_loaders(self.session, context, self._params)
+ bq._unbake_subquery_loaders(
+ self.session, context, self._params, self._post_criteria)
context.statement.use_labels = True
if context.autoflush and not context.populate_existing: