U principu su ti bitna samo prva dva polja od
.description, jer ona uvek imaju vrednost. Prvo polje je ime kolone u bazi, drugo je tip kolone. Posto python podrzava dinamicke tipove ;) drugo polje ti u principu nije nesto bitno (sem ako hoces da se bavis sa operacijama nad datumima i slicno). Za neku prostiju upotrebu ti nije potrebno.
Elem, posto MySQLdb u potpunosti podrzav
DB-API 2.0 specifikaciju,
.description radi bez problema. Pogledaj sledeci primer:
Code:
mydb = MySQLdb.connect(host,user, pass, db)
myst = mydb.cursor()
myst.execute("select stuff, id from testtable")
print myst.description
Izlaz ce biti:
(('stuff', 253, 15, 50, 50, 0, 1), ('id', 3, 5, 11, 11, 0, 1))
Iz ovog tuple-a se moze izvuci sve sto nam je potrebno. Ukoliko ti je potreban i tip kolone u bazi, pogledaj drugo polje u listi. Za
stuff tip je 253, sto je jedan od
MySQLdb.STRING tipova.
No, da nastavimo dalje - kako nam Python dozvoljava dinamicke tipove i dinamicko kreiranje atributa klasa, kreiranje klase koja oznacava red u bazi je krajnje trivijalno, npr. ovako:
Code:
class Row:
def __init__(self,list, row):
[setattr(self, r[1][0], row[r[0]]) for r in enumerate(list)]
U prevodu, klasa ce dobiti atribute koji odgovaraju imenima u bazi. Verujem da je moguce napisati tu klasu i znatno krace, ali ovo mi je prvo palo na pamet :).
Klasa moze biti upotrebljena na sledeci nacin:
Code:
for row in myst.fetchall():
r = Row(myst.description, row)
print r.stuff, r.id
Ako pokusas da napises recimo
print r.ne_postoji dobices AttributeError exception, sto je odlicno jer pomaze u kontroli kôda (na primer, da se ne bi cudio sto r.nekopolje ne vraca nikakvu vrednost).
Naravno, klasa
Row bi mogla da bude znatno komplikovanija ali i ne mora. Ovakva kakva jeste obavlja posao.
Za kraj, sto se tice dokumentacije, pored PEP-a i dokumentacije koja ide uz MySQLdb modul nista ti vise nije potrebno.
Pozdrav,
alex.py ;)
Alex: My favorite site is
http://localhost/
R.J. Oppenheimer: "I am become death, destroyer of worlds" (1945 AD)