summaryrefslogtreecommitdiff
path: root/lib/extras.py
diff options
context:
space:
mode:
authorDaniele Varrazzo <daniele.varrazzo@gmail.com>2018-05-21 03:14:08 +0100
committerDaniele Varrazzo <daniele.varrazzo@gmail.com>2018-05-21 03:14:08 +0100
commit0bb7d0db48d9bca539c7864d14dd813d45bca9a9 (patch)
tree37080cb598e6fe736e396c447560905bdb2f06e0 /lib/extras.py
parent7bdaf0affd0a459dafb827b6faea2e1c1409af1d (diff)
downloadpsycopg2-0bb7d0db48d9bca539c7864d14dd813d45bca9a9.tar.gz
DictCursor and RealDictCursor rows maintain columns order
Close #177.
Diffstat (limited to 'lib/extras.py')
-rw-r--r--lib/extras.py34
1 files changed, 30 insertions, 4 deletions
diff --git a/lib/extras.py b/lib/extras.py
index 904c5f0..ff32ab6 100644
--- a/lib/extras.py
+++ b/lib/extras.py
@@ -29,7 +29,7 @@ import os as _os
import sys as _sys
import time as _time
import re as _re
-from collections import namedtuple
+from collections import namedtuple, OrderedDict
try:
import logging as _logging
@@ -140,12 +140,12 @@ class DictCursor(DictCursorBase):
self._prefetch = 1
def execute(self, query, vars=None):
- self.index = {}
+ self.index = OrderedDict()
self._query_executed = 1
return super(DictCursor, self).execute(query, vars)
def callproc(self, procname, vars=None):
- self.index = {}
+ self.index = OrderedDict()
self._query_executed = 1
return super(DictCursor, self).callproc(procname, vars)
@@ -193,7 +193,7 @@ class DictRow(list):
return default
def copy(self):
- return dict(self.items())
+ return OrderedDict(self.items())
def __contains__(self, x):
return x in self._index
@@ -282,6 +282,32 @@ class RealDictRow(dict):
self.update(data[0])
self._column_mapping = data[1]
+ def __iter__(self):
+ return iter(self._column_mapping)
+
+ def keys(self):
+ return iter(self._column_mapping)
+
+ def values(self):
+ return (self[k] for k in self._column_mapping)
+
+ def items(self):
+ return ((k, self[k]) for k in self._column_mapping)
+
+ if _sys.version_info[0] < 3:
+ iterkeys = keys
+ itervalues = values
+ iteritems = items
+
+ def keys(self):
+ return list(self.iterkeys())
+
+ def values(self):
+ return list(self.itervalues())
+
+ def items(self):
+ return list(self.iteritems())
+
class NamedTupleConnection(_connection):
"""A connection that uses `NamedTupleCursor` automatically."""