summaryrefslogtreecommitdiff
path: root/test/ext
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2018-08-27 11:07:48 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2018-08-27 14:59:08 -0400
commitb601051b217c435934cd41011c8a47de4c783e09 (patch)
tree8874663e4ad0e9e682a2129f4669da9db3dd6add /test/ext
parent90a772b19339b97517bc46f016122341528e440a (diff)
downloadsqlalchemy-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.py60
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