SUGGESTION:
The code below shows an implementation of a new
cursor/ result model. It integrates tuple- and
dictionary functionality. Could be a usefull feature,
but needs still some optimization. It would be usefull
to have the tablenames also so that someone could get
an entry by doing like r["table.field"].
import MySQLdb
import MySQLdb.cursors
class MyRow:
def __init__(self, ptr, seq): """ ptr like
{"id":0, "name":1, "tab.name":1, "jojo":2, ...}
seq like (66L, "Valentina", 1, ...)
"""
self.seq = seq
self.ptr = ptr
def __getitem__(self, name): try: if type(name)==type(""): return self.seq[self.ptr[name]] else: return self.seq[name] except: raise "value doesn't exist" def __len__(self): return len(self.seq) def get(self, name, default=None): try: return self.__getitem__(name) except: return default def has_key(self, name): return self.ptr.has_key(name) def items(self): raise "not implemented, because it would be
confusing. use values() and keys() instead"
def values(self): return self.seq def keys(self): return self.ptr.keys()
class MyCursorMixIn:
_fetch_type = 0 def _createptr(self): ptr = {} i = 0 for k in self.description: ptr[k[0]] = i i = i + 1 return ptr def fetchoneObj(self): r = self.fetchone() return MyRow(self._createptr(), r) def fetchmanyObj(self, size=None): r = list(self.fetchmany(size)) p = self._createptr() for i in range(len(r)): r[i] = MyRow(p, r[i]) return r def fetchallObj(self): r = list(self.fetchall()) p = self._createptr() for i in range(len(r)): r[i] = MyRow(p, r[i]) return r
class MyCursor(MySQLdb.cursors.Cursor, MyCursorMixIn):
pass
conn = MySQLdb.connect(db="manager")
cur = conn.cursor(MyCursor)
cur.execute("select * from mitarbeiter")
print cur.description
for o in cur.fetchallObj():
print o[0],
print o["name"]
Logged In: YES
user_id=71372
This isn't a bug.
The Cursor class family is designed to be extensible. This
kind of extension belongs in another module. Also see
http://dustman.net/andy/python/SQLDict for a cross-platform
(multiple database module) way of doing this.