diff --git a/dataset/persistence/table.py b/dataset/persistence/table.py index 6737d5b..421ea49 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 @@ -281,7 +285,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 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()