From 4cd1902796546d5d2b2927c8e2afbcb00459341f Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Tue, 5 Aug 2008 20:15:28 +0000 Subject: [PATCH] - The RowTuple object returned by Query(*cols) now features keynames which prefer mapped attribute names over column keys, column keys over column names, i.e. Query(Class.foo, Class.bar) will have names "foo" and "bar" even if those are not the names of the underlying Column objects. Direct Column objects such as Query(table.c.col) will return the "key" attribute of the Column. --- CHANGES | 14 ++++++++++++++ VERSION | 2 +- lib/sqlalchemy/orm/query.py | 8 ++++++-- test/orm/inheritance/query.py | 5 +++++ test/orm/inheritance/single.py | 4 ++++ test/orm/query.py | 15 +++++++++++++++ 6 files changed, 45 insertions(+), 3 deletions(-) diff --git a/CHANGES b/CHANGES index 7378441784..ed6c26f525 100644 --- a/CHANGES +++ b/CHANGES @@ -3,6 +3,20 @@ ======= CHANGES ======= +0.5beta4 +======== + +- orm + - The RowTuple object returned by Query(*cols) now + features keynames which prefer mapped attribute + names over column keys, column keys over + column names, i.e. + Query(Class.foo, Class.bar) will have names + "foo" and "bar" even if those are not the names + of the underlying Column objects. Direct + Column objects such as Query(table.c.col) will + return the "key" attribute of the Column. + 0.5beta3 ======== - 0.5beta3 includes all bugfixes listed under release diff --git a/VERSION b/VERSION index 3f499c3151..b9eb5bd6e8 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.5.0beta3 +0.5.0beta4 diff --git a/lib/sqlalchemy/orm/query.py b/lib/sqlalchemy/orm/query.py index 605486203d..43dde9fc05 100644 --- a/lib/sqlalchemy/orm/query.py +++ b/lib/sqlalchemy/orm/query.py @@ -1611,11 +1611,15 @@ class _ColumnEntity(_QueryEntity): if isinstance(column, basestring): column = sql.literal_column(column) + self._result_label = column.name elif isinstance(column, (attributes.QueryableAttribute, mapper.Mapper._CompileOnAttr)): + self._result_label = column.impl.key column = column.__clause_element__() elif not isinstance(column, sql.ColumnElement): raise sa_exc.InvalidRequestError("Invalid column expression '%r'" % column) - + else: + self._result_label = getattr(column, 'key', None) + if not hasattr(column, '_label'): column = column.label(None) @@ -1656,7 +1660,7 @@ class _ColumnEntity(_QueryEntity): def proc(context, row): return row[column] - return (proc, getattr(column, 'name', None)) + return (proc, self._result_label) def setup_context(self, query, context): column = self._resolve_expr_against_query_aliases(query, self.column, context) diff --git a/test/orm/inheritance/query.py b/test/orm/inheritance/query.py index 08669bf590..0ce3b4fb78 100644 --- a/test/orm/inheritance/query.py +++ b/test/orm/inheritance/query.py @@ -538,6 +538,11 @@ def make_test(select_type): ) + row = sess.query(Engineer.name, Engineer.primary_language).filter(Engineer.name=='dilbert').first() + assert row.name == 'dilbert' + assert row.primary_language == 'java' + + self.assertEquals( sess.query(Engineer.name, Engineer.primary_language).all(), [(u'dilbert', u'java'), (u'wally', u'c++'), (u'vlad', u'cobol')] diff --git a/test/orm/inheritance/single.py b/test/orm/inheritance/single.py index 17497177e4..ba2f930d0a 100644 --- a/test/orm/inheritance/single.py +++ b/test/orm/inheritance/single.py @@ -53,6 +53,10 @@ class SingleInheritanceTest(MappedTest): session.expire(m1, ['manager_data']) self.assertEquals(m1.manager_data, "knows how to manage things") + row = session.query(Engineer.name, Engineer.employee_id).filter(Engineer.name=='Kurt').first() + assert row.name == 'Kurt' + assert row.employee_id == e1.employee_id + @testing.resolve_artifact_names def test_multi_qualification(self): session = create_session() diff --git a/test/orm/query.py b/test/orm/query.py index 6ee9bbd9d8..30cb03ab86 100644 --- a/test/orm/query.py +++ b/test/orm/query.py @@ -58,6 +58,21 @@ class UnicodeSchemaTest(QueryTest): mapper(User, uni_users) assert User(id=7) == create_session(bind=testing.db).query(User).get(7) +class RowTupleTest(QueryTest): + keep_mappers = False + + def setup_mappers(self): + pass + + def test_custom_names(self): + mapper(User, users, properties={ + 'uname':users.c.name + }) + + row = create_session().query(User.id, User.uname).filter(User.id==7).first() + assert row.id == 7 + assert row.uname == 'jack' + class GetTest(QueryTest): def test_get(self): s = create_session() -- 2.47.3