diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2018-08-27 11:07:48 -0400 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2018-08-27 14:59:08 -0400 |
| commit | b601051b217c435934cd41011c8a47de4c783e09 (patch) | |
| tree | 8874663e4ad0e9e682a2129f4669da9db3dd6add /test/ext | |
| parent | 90a772b19339b97517bc46f016122341528e440a (diff) | |
| download | sqlalchemy-b601051b217c435934cd41011c8a47de4c783e09.tar.gz | |
Add BakedQuery.to_query() method
Added new feature :meth:`.BakedQuery.to_query`, which allows for a
clean way of using one :class:`.BakedQuery` as a subquery inside of another
:class:`.BakedQuery` without needing to refer explicitly to a
:class:`.Session`.
Fixes: #4318
Change-Id: I528056c7d140036c27b95500d7a60dcd14784016
Diffstat (limited to 'test/ext')
| -rw-r--r-- | test/ext/test_baked.py | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/test/ext/test_baked.py b/test/ext/test_baked.py index c17e81fdd..f6afabd2d 100644 --- a/test/ext/test_baked.py +++ b/test/ext/test_baked.py @@ -7,10 +7,12 @@ from test.orm import _fixtures from sqlalchemy.ext import baked from sqlalchemy import bindparam, func from sqlalchemy.orm import exc as orm_exc +from sqlalchemy.orm.query import Query import itertools from sqlalchemy.testing import mock from sqlalchemy.testing.assertsql import CompiledSQL import contextlib +from sqlalchemy import exc as sa_exc class BakedTest(_fixtures.FixtureTest): @@ -741,6 +743,64 @@ class ResultTest(BakedTest): sess.close() + def test_to_query_query(self): + User = self.classes.User + Address = self.classes.Address + + sub_bq = self.bakery( + lambda s: s.query(User.name) + ) + sub_bq += lambda q: q.filter( + User.id == Address.user_id).filter(User.name == 'ed').\ + correlate(Address) + + main_bq = self.bakery(lambda s: s.query(Address.id)) + main_bq += lambda q: q.filter( + sub_bq.to_query(q).exists()) + main_bq += lambda q: q.order_by(Address.id) + + sess = Session() + result = main_bq(sess).all() + eq_(result, [(2,), (3,), (4,)]) + + def test_to_query_session(self): + User = self.classes.User + Address = self.classes.Address + + sub_bq = self.bakery( + lambda s: s.query(User.name) + ) + sub_bq += lambda q: q.filter( + User.id == Address.user_id).correlate(Address) + + main_bq = self.bakery( + lambda s: s.query(Address.id, sub_bq.to_query(s).as_scalar())) + main_bq += lambda q: q.filter(sub_bq.to_query(q).as_scalar() == 'ed') + main_bq += lambda q: q.order_by(Address.id) + + sess = Session() + result = main_bq(sess).all() + eq_(result, [(2, 'ed'), (3, 'ed'), (4, 'ed')]) + + def test_to_query_args(self): + User = self.classes.User + sub_bq = self.bakery( + lambda s: s.query(User.name) + ) + + q = Query([], None) + assert_raises_message( + sa_exc.ArgumentError, + "Given Query needs to be associated with a Session", + sub_bq.to_query, q + ) + + assert_raises_message( + TypeError, + "Query or Session object expected, got .*'int'.*", + sub_bq.to_query, 5 + ) + def test_subquery_eagerloading(self): User = self.classes.User Address = self.classes.Address |
