From 35c42310ec14722ddf5c888cff33e5ff3b958da1 Mon Sep 17 00:00:00 2001 From: Federico Di Gregorio Date: Tue, 10 May 2005 02:29:24 +0000 Subject: [PATCH] DictRow fixes. --- ChangeLog | 8 ++++++++ examples/dict.py | 45 +++++++++++++++++++++++++++++++++++++++++++++ lib/extras.py | 8 ++++---- 3 files changed, 57 insertions(+), 4 deletions(-) create mode 100644 examples/dict.py diff --git a/ChangeLog b/ChangeLog index c688507e..1c423311 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2005-05-10 Federico Di Gregorio + + * 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 * Release 2.0 beta 1. diff --git a/examples/dict.py b/examples/dict.py new file mode 100644 index 00000000..37fb0713 --- /dev/null +++ b/examples/dict.py @@ -0,0 +1,45 @@ +# dict.py - using DictCUrsor/DictRow +# +# Copyright (C) 2005 Federico Di Gregorio +# +# 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] diff --git a/lib/extras.py b/lib/extras.py index 3e264a02..a494d8a7 100644 --- a/lib/extras.py +++ b/lib/extras.py @@ -62,22 +62,22 @@ class DictRow(list): """A row object that allow by-colun-name access to data.""" def __init__(self, cursor): - self._cursor = cursor + self._index = cursor.index self[:] = [None] * len(cursor.description) def __getitem__(self, x): if type(x) != int: - x = self._cursor.index[x] + x = self._index[x] return list.__getitem__(self, x) def items(self): res = [] - for n, v in self._cursor.index.items(): + for n, v in self._index.items(): res.append((n, list.__getitem__(self, v))) return res def keys(self): - return self._cursor.index.keys() + return self._index.keys()