DictRow fixes.

This commit is contained in:
Federico Di Gregorio 2005-05-10 02:29:24 +00:00
parent d57ceaadc6
commit 35c42310ec
3 changed files with 57 additions and 4 deletions

View File

@ -1,3 +1,11 @@
2005-05-10 Federico Di Gregorio <fog@debian.org>
* lib/extras.py (DictRow): we now save a reference to the index
itself and not to the cursor to avoid problems while accessing
DictRow objects after reusing the cursor for a different query
(using Kevin Jacobs db_row would be much better but DictRow is
just an example, right?)
2005-05-09 Federico Di Gregorio <fog@debian.org> 2005-05-09 Federico Di Gregorio <fog@debian.org>
* Release 2.0 beta 1. * Release 2.0 beta 1.

45
examples/dict.py Normal file
View File

@ -0,0 +1,45 @@
# dict.py - using DictCUrsor/DictRow
#
# Copyright (C) 2005 Federico Di Gregorio <fog@debian.org>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by the
# Free Software Foundation; either version 2, or (at your option) any later
# version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY
# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# for more details.
## put in DSN your DSN string
DSN = 'dbname=test'
## don't modify anything below this line (except for experimenting)
import sys
import psycopg
import psycopg.extras
if len(sys.argv) > 1:
DSN = sys.argv[1]
print "Opening connection using dsn:", DSN
conn = psycopg.connect(DSN)
print "Encoding for this connection is", conn.encoding
curs = conn.cursor(cursor_factory=psycopg.extras.DictCursor)
curs.execute("SELECT 1 AS foo, 'cip' AS bar, date(now()) as zot")
data = curs.fetchone()
print "Some data accessed both as tuple and dict:"
print " ", data['foo'], data['bar'], data['zot']
print " ", data[0], data[1], data[2]
# execute another query and demostrate we can still access the row
curs.execute("SELECT 2 AS foo")
print "Some more data accessed both as tuple and dict:"
print " ", data['foo'], data['bar'], data['zot']
print " ", data[0], data[1], data[2]

View File

@ -62,22 +62,22 @@ class DictRow(list):
"""A row object that allow by-colun-name access to data.""" """A row object that allow by-colun-name access to data."""
def __init__(self, cursor): def __init__(self, cursor):
self._cursor = cursor self._index = cursor.index
self[:] = [None] * len(cursor.description) self[:] = [None] * len(cursor.description)
def __getitem__(self, x): def __getitem__(self, x):
if type(x) != int: if type(x) != int:
x = self._cursor.index[x] x = self._index[x]
return list.__getitem__(self, x) return list.__getitem__(self, x)
def items(self): def items(self):
res = [] res = []
for n, v in self._cursor.index.items(): for n, v in self._index.items():
res.append((n, list.__getitem__(self, v))) res.append((n, list.__getitem__(self, v)))
return res return res
def keys(self): def keys(self):
return self._cursor.index.keys() return self._index.keys()