Revert to using OrderedDict.

This commit is contained in:
Friedrich Lindenberg 2014-02-18 12:59:12 +01:00
parent a963e4a5ed
commit 6ef4cd7814
3 changed files with 20 additions and 7 deletions

View File

@ -5,7 +5,7 @@ from sqlalchemy.sql import and_, expression
from sqlalchemy.schema import Column, Index from sqlalchemy.schema import Column, Index
from sqlalchemy import alias from sqlalchemy import alias
from dataset.persistence.util import guess_type 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 from dataset.util import DatasetException
@ -282,9 +282,7 @@ class Table(object):
args = self._args_to_clause(_filter) args = self._args_to_clause(_filter)
query = self.table.select(whereclause=args, limit=1) query = self.table.select(whereclause=args, limit=1)
rp = self.database.executable.execute(query) rp = self.database.executable.execute(query)
data = rp.fetchone() return convert_row(rp.fetchone())
if data is not None:
return data
def _args_to_order_by(self, order_by): def _args_to_order_by(self, order_by):
if order_by[0] == '-': if order_by[0] == '-':

View File

@ -1,6 +1,11 @@
from datetime import datetime, timedelta from datetime import datetime, timedelta
from inspect import isgenerator 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 from sqlalchemy import Integer, UnicodeText, Float, DateTime, Boolean, types, Table, event
@ -16,6 +21,12 @@ def guess_type(sample):
return UnicodeText return UnicodeText
def convert_row(row):
if row is None:
return None
return OrderedDict(row.items())
class ResultIter(object): class ResultIter(object):
""" SQLAlchemy ResultProxies are not iterable to get a """ SQLAlchemy ResultProxies are not iterable to get a
list of dictionaries. This is to wrap them. """ list of dictionaries. This is to wrap them. """
@ -47,7 +58,7 @@ class ResultIter(object):
else: else:
# stop here # stop here
raise StopIteration raise StopIteration
return row return convert_row(row)
next = __next__ next = __next__
@ -66,6 +77,8 @@ def sqlite_datetime_fix():
return (value / 1000 - self.epoch).total_seconds() return (value / 1000 - self.epoch).total_seconds()
def process_result_value(self, value, dialect): def process_result_value(self, value, dialect):
if isinstance(value, basestring):
return value
return self.epoch + timedelta(seconds=value / 1000) return self.epoch + timedelta(seconds=value / 1000)
def is_sqlite(inspector): def is_sqlite(inspector):

View File

@ -124,9 +124,11 @@ class DatabaseTestCase(unittest.TestCase):
def test_table_cache_updates(self): def test_table_cache_updates(self):
tbl1 = self.db.get_table('people') 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') 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): class TableTestCase(unittest.TestCase):