From: Robert Leftwich Date: Sun, 29 Jan 2006 12:30:32 +0000 (+0000) Subject: Reworked RowProxy to restore column order preservation and to remove some dictionary... X-Git-Tag: rel_0_1_0~92 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d2a548d33107b0dd6d37b50e92ce39bf827461b0;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git Reworked RowProxy to restore column order preservation and to remove some dictionary-like behaviour that was unnecessary and caused breakage in existing code. Added tests for column preservation. --- diff --git a/lib/sqlalchemy/engine.py b/lib/sqlalchemy/engine.py index 3a3af2ce93..445ddae242 100644 --- a/lib/sqlalchemy/engine.py +++ b/lib/sqlalchemy/engine.py @@ -688,36 +688,23 @@ class RowProxy: """RowProxy objects are constructed by ResultProxy objects.""" self.__parent = parent self.__row = row - def keys(self): - return self.__parent.keys def __iter__(self): - for k in self.keys(): - yield k + for i in range(0, len(self.__row)): + yield self.__parent._get_col(self.__row, i) def __eq__(self, other): return (other is self) or (other == tuple([self.__parent._get_col(self.__row, key) for key in range(0, len(self.__row))])) def __repr__(self): - return repr(dict(self.iteritems())) + return repr(tuple([self.__parent._get_col(self.__row, key) for key in range(0, len(self.__row))])) def __getitem__(self, key): return self.__parent._get_col(self.__row, key) def __getattr__(self, name): try: - return self[name] + return self.__parent._get_col(self.__row, name) except: raise AttributeError - def iteritems(self): - for k in self: - yield (k, self[k]) - def iterkeys(self): - return self.__iter__() - def itervalues(self): - for _, v in self.iteritems(): - yield v - def values(self): - return [v for _, v in self.iteritems()] - def items(self): - return list(self.iteritems()) - def __len__(self): - return len(self.keys()) - - - + def keys(self): + return self.__parent.keys + def values(self): + return list(self) + def __len__(self): + return len(self.__row) diff --git a/test/query.py b/test/query.py index cae0c30693..e89d40b1ef 100644 --- a/test/query.py +++ b/test/query.py @@ -108,15 +108,37 @@ class QueryTest(PersistTest): self.assert_(r.user_id == r['user_id'] == r[self.users.c.user_id] == 2) self.assert_(r.user_name == r['user_name'] == r[self.users.c.user_name] == 'jack') - def test_column_dict_behaviours(self): + def test_keys(self): self.users.insert().execute(user_id=1, user_name='foo') r = self.users.select().execute().fetchone() self.assertEqual(r.keys(), ['user_id', 'user_name']) - self.assertEqual(r.items(), [('user_id', 1), ('user_name', 'foo')]) - self.assertEqual(r.values(), [1, 'foo']) - self.assertEqual(zip(r.itervalues(), r.iterkeys()), zip(r.values(), r.keys())) - self.assertEqual(repr(r), "{'user_name': u'foo', 'user_id': 1}") + + def test_len(self): + self.users.insert().execute(user_id=1, user_name='foo') + r = self.users.select().execute().fetchone() + self.assertEqual(len(r), 2) + r = db.execute('select user_name, user_id from query_users', {}).fetchone() self.assertEqual(len(r), 2) + r = db.execute('select user_name from query_users', {}).fetchone() + self.assertEqual(len(r), 1) + + def test_column_order_with_simple_query(self): + # should return values in column definition order + self.users.insert().execute(user_id=1, user_name='foo') + r = self.users.select(self.users.c.user_id==1).execute().fetchone() + self.assertEqual(r[0], 1) + self.assertEqual(r[1], 'foo') + self.assertEqual(r.keys(), ['user_id', 'user_name']) + self.assertEqual(r.values(), [1, 'foo']) + + def test_column_order_with_text_query(self): + # should return values in query order + self.users.insert().execute(user_id=1, user_name='foo') + r = db.execute('select user_name, user_id from query_users', {}).fetchone() + self.assertEqual(r[0], 'foo') + self.assertEqual(r[1], 1) + self.assertEqual(r.keys(), ['user_name', 'user_id']) + self.assertEqual(r.values(), ['foo', 1]) def test_column_accessor_shadow(self): shadowed = Table('test_shadowed', db,