From 03cca31b5bf0a61c024da3b6cc97d19795d77a01 Mon Sep 17 00:00:00 2001 From: Gregor Aisch Date: Thu, 19 Dec 2013 23:46:10 +0100 Subject: [PATCH 1/2] added test for ordered keys --- test/test_persistence.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test/test_persistence.py b/test/test_persistence.py index 015f1fc..b8dc7e1 100644 --- a/test/test_persistence.py +++ b/test/test_persistence.py @@ -244,5 +244,11 @@ class TableTestCase(unittest.TestCase): assert FLOAT == type(tbl.table.c['foo'].type), tbl.table.c['foo'].type assert 'foo' in tbl.columns, tbl.columns + def test_key_order(self): + res = self.db.query('SELECT temperature, place FROM weather LIMIT 1') + keys = res.next().keys() + assert keys[0] == 'temperature' + assert keys[1] == 'place' + if __name__ == '__main__': unittest.main() From 2566581442eff9b17ee439296e7c4e9c232cee26 Mon Sep 17 00:00:00 2001 From: Gregor Aisch Date: Fri, 20 Dec 2013 00:01:26 +0100 Subject: [PATCH 2/2] using OrderedDict to preserve key order --- dataset/persistence/table.py | 6 +++++- dataset/persistence/util.py | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/dataset/persistence/table.py b/dataset/persistence/table.py index c76b1fd..2296d59 100644 --- a/dataset/persistence/table.py +++ b/dataset/persistence/table.py @@ -1,5 +1,9 @@ import logging from itertools import count +try: + from collections import OrderedDict +except ImportError: + from ordereddict import OrderedDict # Python < 2.7 drop-in from sqlalchemy.sql import and_, expression from sqlalchemy.schema import Column, Index @@ -280,7 +284,7 @@ class Table(object): rp = self.database.executable.execute(query) data = rp.fetchone() if data is not None: - return dict(zip(rp.keys(), data)) + return OrderedDict(zip(rp.keys(), data)) def _args_to_order_by(self, order_by): if order_by[0] == '-': diff --git a/dataset/persistence/util.py b/dataset/persistence/util.py index 019f620..e0f358f 100644 --- a/dataset/persistence/util.py +++ b/dataset/persistence/util.py @@ -1,5 +1,9 @@ from datetime import datetime from inspect import isgenerator +try: + from collections import OrderedDict +except ImportError: + from ordereddict import OrderedDict # Python < 2.7 drop-in from sqlalchemy import Integer, UnicodeText, Float, DateTime, Boolean @@ -46,7 +50,7 @@ class ResultIter(object): else: # stop here raise StopIteration - return dict(zip(self.keys, row)) + return OrderedDict(zip(self.keys, row)) def __iter__(self): return self