diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2008-03-29 00:00:49 +0000 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2008-03-29 00:00:49 +0000 |
commit | c4955c05a3ab40d53c83982da612e746c662640d (patch) | |
tree | c979c566711917679c9fa5d31b6dbcdb1c76eb34 /test/orm/query.py | |
parent | 30020880d90ee2f983b8e6bfb1624349209dd8b0 (diff) | |
download | sqlalchemy-c4955c05a3ab40d53c83982da612e746c662640d.tar.gz |
- merged with_polymorphic branch, which was merged with query_columns branch
- removes everything to do with select_table, which remains as a keyword argument synonymous with
with_polymorphic=('*', select_table).
- all "polymorphic" selectables find their way to Query by way of _set_select_from() now, so that
all joins/aliasing/eager loads/etc. is handled consistently. Mapper has methods for producing
polymorphic selectables so that Query and eagerloaders alike can get to them.
- row aliasing simplified, so that they don't need to nest. they only need the source selectable
and adapt to whatever incoming columns they get.
- Query is more egalitarian about mappers/columns now. Still has a strong sense of "entity zero",
but also introduces new unpublished/experimental _values() method which sets up a columns-only query.
- Query.order_by() and Query.group_by() take *args now (also still take a list, will likely deprecate
in 0.5). May want to do this for select() as well.
- the existing "check for False discriminiator" "fix" was not working completely, added coverage
- orphan detection was broken when the target object was a subclass of the mapper with the orphaned
relation, fixed that too.
Diffstat (limited to 'test/orm/query.py')
-rw-r--r-- | test/orm/query.py | 43 |
1 files changed, 36 insertions, 7 deletions
diff --git a/test/orm/query.py b/test/orm/query.py index e2031863b..a4dbb938d 100644 --- a/test/orm/query.py +++ b/test/orm/query.py @@ -64,6 +64,7 @@ class GetTest(QueryTest): """test that get()/load() does not use preexisting filter/etc. criterion""" s = create_session() + try: s.query(User).join('addresses').filter(Address.user_id==8).get(7) assert False @@ -835,7 +836,7 @@ class InstancesTest(QueryTest): def decorate(row): d = {} - for c in addresses.columns: + for c in addresses.c: d[c] = row[adalias.corresponding_column(c)] return d @@ -865,7 +866,40 @@ class InstancesTest(QueryTest): self.assert_sql_count(testing.db, go, 1) sess.clear() + def test_columns(self): + sess = create_session() + sel = users.select(User.id.in_([7, 8])).alias() + q = sess.query(User) + q2 = q.select_from(sel)._values(User.name) + self.assertEquals(q2.all(), [(u'jack',), (u'ed',)]) + + q = sess.query(User) + q2 = q._values(User.name, User.name + " " + cast(User.id, String)).order_by(User.id) + self.assertEquals(q2.all(), [(u'jack', u'jack 7'), (u'ed', u'ed 8'), (u'fred', u'fred 9'), (u'chuck', u'chuck 10')]) + + q2 = q._values(User.name.like('%j%'), func.count(User.name.like('%j%'))).group_by([User.name.like('%j%')]).order_by(desc(User.name.like('%j%'))) + self.assertEquals(q2.all(), [(True, 1), (False, 3)]) + + q2 = q.join('addresses').filter(User.name.like('%e%')).order_by(User.id, Address.id)._values(User.name, Address.email_address) + self.assertEquals(q2.all(), [(u'ed', u'ed@wood.com'), (u'ed', u'ed@bettyboop.com'), (u'ed', u'ed@lala.com'), (u'fred', u'fred@fred.com')]) + + q2 = q.join('addresses').filter(User.name.like('%e%'))._values(User.name, Address.email_address).order_by(desc(Address.email_address))[1:3] + self.assertEquals(q2.all(), [(u'ed', u'ed@wood.com'), (u'ed', u'ed@lala.com')]) + + q2 = q.join('addresses', aliased=True).filter(User.name.like('%e%'))._values(User.name, Address.email_address) + self.assertEquals(q2.all(), [(u'ed', u'ed@wood.com'), (u'ed', u'ed@bettyboop.com'), (u'ed', u'ed@lala.com'), (u'fred', u'fred@fred.com')]) + + q2 = q._values(func.count(User.name)) + assert q2.one() == (4,) + + u2 = users.alias() + q2 = q.select_from(sel).filter(u2.c.id>1)._values(users.c.name, sel.c.name, u2.c.name).order_by([users.c.id, sel.c.id, u2.c.id]) + self.assertEquals(q2.all(), [(u'jack', u'jack', u'jack'), (u'jack', u'jack', u'ed'), (u'jack', u'jack', u'fred'), (u'jack', u'jack', u'chuck'), (u'ed', u'ed', u'jack'), (u'ed', u'ed', u'ed'), (u'ed', u'ed', u'fred'), (u'ed', u'ed', u'chuck')]) + + q2 = q.select_from(sel).filter(users.c.id>1)._values(users.c.name, sel.c.name, User.name) + self.assertEquals(q2.all(), [(u'jack', u'jack', u'jack'), (u'ed', u'ed', u'ed')]) + def test_multi_mappers(self): test_session = create_session() @@ -946,12 +980,7 @@ class InstancesTest(QueryTest): assert sess.query(User).add_column(add_col).all() == expected sess.clear() - try: - sess.query(User).add_column(object()).all() - assert False - except exceptions.InvalidRequestError, e: - assert "Invalid column expression" in str(e) - + self.assertRaises(exceptions.InvalidRequestError, sess.query(User).add_column, object()) def test_multi_columns_2(self): """test aliased/nonalised joins with the usage of add_column()""" |