diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2007-11-27 16:57:56 +0000 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2007-11-27 16:57:56 +0000 |
commit | 3f6e94e8185591bd5a32f3558bb5419e0df01763 (patch) | |
tree | 68d88e8fdab2c497d293d5df616c82ca56c4c939 | |
parent | 6ed4645f02f6cff6bfb46c2eb93004d378a9f423 (diff) | |
download | sqlalchemy-3f6e94e8185591bd5a32f3558bb5419e0df01763.tar.gz |
- column labels in the form "tablename.columname", i.e. with a dot, are now
supported.
-rw-r--r-- | CHANGES | 15 | ||||
-rw-r--r-- | lib/sqlalchemy/engine/base.py | 19 | ||||
-rw-r--r-- | test/sql/query.py | 5 |
3 files changed, 29 insertions, 10 deletions
@@ -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 9e3004325..4e6247810 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 7790b5f34..fa88c5fe6 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): |