diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2018-02-25 19:54:37 -0500 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2018-02-28 10:52:59 -0500 |
| commit | 4a31c30fa5ebd6af0e72937b21b2e5ee79e12631 (patch) | |
| tree | 289f52c9255b6406fb1cdc335c20c7e3b65e409d /lib/sqlalchemy/ext/baked.py | |
| parent | a10bc4fdaa8ff95a2b7930622cb76a1aa07806f1 (diff) | |
| download | sqlalchemy-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.py | 11 |
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: |
