From 6ef4cd7814c587e92132866e668da9c753f79bd2 Mon Sep 17 00:00:00 2001 From: Friedrich Lindenberg Date: Tue, 18 Feb 2014 12:59:12 +0100 Subject: [PATCH] Revert to using OrderedDict. --- dataset/persistence/table.py | 6 ++---- dataset/persistence/util.py | 15 ++++++++++++++- test/test_persistence.py | 6 ++++-- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/dataset/persistence/table.py b/dataset/persistence/table.py index 2fbcee1..10a7625 100644 --- a/dataset/persistence/table.py +++ b/dataset/persistence/table.py @@ -5,7 +5,7 @@ from sqlalchemy.sql import and_, expression from sqlalchemy.schema import Column, Index from sqlalchemy import alias from dataset.persistence.util import guess_type -from dataset.persistence.util import ResultIter +from dataset.persistence.util import ResultIter, convert_row from dataset.util import DatasetException @@ -282,9 +282,7 @@ class Table(object): args = self._args_to_clause(_filter) query = self.table.select(whereclause=args, limit=1) rp = self.database.executable.execute(query) - data = rp.fetchone() - if data is not None: - return data + return convert_row(rp.fetchone()) 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 c9930e3..490494a 100644 --- a/dataset/persistence/util.py +++ b/dataset/persistence/util.py @@ -1,6 +1,11 @@ from datetime import datetime, timedelta from inspect import isgenerator +try: + from collections import OrderedDict +except ImportError: + from ordereddict import OrderedDict + from sqlalchemy import Integer, UnicodeText, Float, DateTime, Boolean, types, Table, event @@ -16,6 +21,12 @@ def guess_type(sample): return UnicodeText +def convert_row(row): + if row is None: + return None + return OrderedDict(row.items()) + + class ResultIter(object): """ SQLAlchemy ResultProxies are not iterable to get a list of dictionaries. This is to wrap them. """ @@ -47,7 +58,7 @@ class ResultIter(object): else: # stop here raise StopIteration - return row + return convert_row(row) next = __next__ @@ -66,6 +77,8 @@ def sqlite_datetime_fix(): return (value / 1000 - self.epoch).total_seconds() def process_result_value(self, value, dialect): + if isinstance(value, basestring): + return value return self.epoch + timedelta(seconds=value / 1000) def is_sqlite(inspector): diff --git a/test/test_persistence.py b/test/test_persistence.py index 4f23c52..6cc8654 100644 --- a/test/test_persistence.py +++ b/test/test_persistence.py @@ -124,9 +124,11 @@ class DatabaseTestCase(unittest.TestCase): def test_table_cache_updates(self): tbl1 = self.db.get_table('people') - tbl1.insert(OrderedDict([('first_name', 'John'), ('last_name', 'Smith')])) + data = OrderedDict([('first_name', 'John'), ('last_name', 'Smith')]) + tbl1.insert(data) + data['id'] = 1 tbl2 = self.db.get_table('people') - assert list(tbl2.all()) == [(1, 'John', 'Smith')] + assert dict(tbl2.all().next()) == dict(data), (tbl2.all().next(), data) class TableTestCase(unittest.TestCase):