diff options
-rw-r--r-- | doc/build/changelog/changelog_10.rst | 10 | ||||
-rw-r--r-- | lib/sqlalchemy/ext/baked.py | 9 | ||||
-rw-r--r-- | test/ext/test_baked.py | 20 |
3 files changed, 33 insertions, 6 deletions
diff --git a/doc/build/changelog/changelog_10.rst b/doc/build/changelog/changelog_10.rst index 038b5b4da..63f2c797f 100644 --- a/doc/build/changelog/changelog_10.rst +++ b/doc/build/changelog/changelog_10.rst @@ -19,6 +19,16 @@ :version: 1.0.5 .. change:: + :tags: feature, ext + :pullreq: bitbucket:54 + + Added support for ``*args`` to be passed to the baked query + initial callable, in the same way that ``*args`` are supported + for the :meth:`.BakedQuery.add_criteria` and + :meth:`.BakedQuery.with_criteria` methods. Initial PR courtesy + Naoki INADA. + + .. change:: :tags: bug, engine :tickets: 3435 diff --git a/lib/sqlalchemy/ext/baked.py b/lib/sqlalchemy/ext/baked.py index 96e1f1312..f01e0b348 100644 --- a/lib/sqlalchemy/ext/baked.py +++ b/lib/sqlalchemy/ext/baked.py @@ -34,11 +34,8 @@ class BakedQuery(object): __slots__ = 'steps', '_bakery', '_cache_key', '_spoiled' def __init__(self, bakery, initial_fn, args=()): - if args: - self._cache_key = tuple(args) - else: - self._cache_key = () - self._update_cache_key(initial_fn) + self._cache_key = () + self._update_cache_key(initial_fn, args) self.steps = [initial_fn] self._spoiled = False self._bakery = bakery @@ -49,7 +46,7 @@ class BakedQuery(object): _bakery = util.LRUCache(size) - def call(initial_fn, args=()): + def call(initial_fn, *args): return cls(_bakery, initial_fn, args) return call diff --git a/test/ext/test_baked.py b/test/ext/test_baked.py index 92ce45c3f..78c43fc7e 100644 --- a/test/ext/test_baked.py +++ b/test/ext/test_baked.py @@ -242,6 +242,26 @@ class ResultTest(BakedTest): }) mapper(Address, cls.tables.addresses) + def test_cachekeys_on_constructor(self): + User = self.classes.User + + queue = [7, 8] + fn = lambda s: s.query(User.id).filter_by(id=queue.pop(0)) + bq1 = self.bakery(fn, 7) + bq2 = self.bakery(fn, 8) + + for i in range(3): + session = Session(autocommit=True) + eq_( + bq1(session).all(), + [(7,)] + ) + + eq_( + bq2(session).all(), + [(8,)] + ) + def test_no_steps(self): User = self.classes.User |