From 3f6e94e8185591bd5a32f3558bb5419e0df01763 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Tue, 27 Nov 2007 16:57:56 +0000 Subject: [PATCH] - column labels in the form "tablename.columname", i.e. with a dot, are now supported. --- CHANGES | 15 +++++++++------ lib/sqlalchemy/engine/base.py | 19 +++++++++++++++---- test/sql/query.py | 5 +++++ 3 files changed, 29 insertions(+), 10 deletions(-) diff --git a/CHANGES b/CHANGES index adb61906c2..9ff6189529 100644 --- a/CHANGES +++ b/CHANGES @@ -5,12 +5,15 @@ CHANGES ----- - sql - added new flag to String and create_engine(), assert_unicode=(True|False|None). - When convert_unicode=True, this flag also defaults to `True`, and results in all - unicode conversion operations raising an exception when a non-unicode bytestring - is passed as a bind parameter. It is strongly advised that all unicode-aware - applications make proper use of Python unicode objects (i.e. u'hello' and - not 'hello'). - + When convert_unicode=True, this flag also defaults to `True`, and results in all + unicode conversion operations raising an exception when a non-unicode bytestring + is passed as a bind parameter. It is strongly advised that all unicode-aware + applications make proper use of Python unicode objects (i.e. u'hello' and + not 'hello'). + + - column labels in the form "tablename.columname", i.e. with a dot, are now + supported. + - orm - fixed endless loop issue when using lazy="dynamic" on both diff --git a/lib/sqlalchemy/engine/base.py b/lib/sqlalchemy/engine/base.py index 9e30043253..4e62478105 100644 --- a/lib/sqlalchemy/engine/base.py +++ b/lib/sqlalchemy/engine/base.py @@ -1342,9 +1342,15 @@ class ResultProxy(object): typemap = self.dialect.dbapi_type_map for i, item in enumerate(metadata): - # sqlite possibly prepending table name to colnames so strip - colname = (item[0].split('.')[-1]).decode(self.dialect.encoding) - + colname = item[0].decode(self.dialect.encoding) + + if '.' in colname: + # sqlite will in some circumstances prepend table name to colnames, so strip + origname = colname + colname = colname.split('.')[-1] + else: + origname = None + if self.context.result_map: try: (name, obj, type_) = self.context.result_map[colname] @@ -1356,7 +1362,12 @@ class ResultProxy(object): rec = (type_, type_.dialect_impl(self.dialect).result_processor(self.dialect), i) if self.__props.setdefault(name.lower(), rec) is not rec: - self.__props[name.lower()] = (type_, self.__ambiguous_processor(colname), 0) + self.__props[name.lower()] = (type_, self.__ambiguous_processor(name), 0) + + # store the "origname" if we truncated (sqlite only) + if origname: + if self.__props.setdefault(origname.lower(), rec) is not rec: + self.__props[origname.lower()] = (type_, self.__ambiguous_processor(origname), 0) self.__keys.append(colname) self.__props[i] = rec diff --git a/test/sql/query.py b/test/sql/query.py index 7790b5f34a..fa88c5fe63 100644 --- a/test/sql/query.py +++ b/test/sql/query.py @@ -361,6 +361,11 @@ class QueryTest(PersistTest): "UNION select query_users.user_id, query_users.user_name from query_users", bind=testbase.db).execute().fetchone() self.assert_(r['user_id']) == 1 self.assert_(r['user_name']) == "john" + + # test using literal tablename.colname + r = text('select query_users.user_id AS "query_users.user_id", query_users.user_name AS "query_users.user_name" from query_users', bind=testbase.db).execute().fetchone() + self.assert_(r['query_users.user_id']) == 1 + self.assert_(r['query_users.user_name']) == "john" def test_ambiguous_column(self): -- 2.47.2