Python + MySQL

Recientemente empece a trabajar en un proyecto en el que necesito conectar python con mysql. Sorprendentemente, no hay tanta documentacion como yo espere que hubiera, por lo cual quiero compartir un secretito que acabo de aprender.

Supongamos que tenemos la siguiente tabla:

+-------------+--------------+------+-----+---------+-------+
| Field       | Type         | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+-------+
| id          | varchar(20)  | NO   | PRI |         |       |
| name        | varchar(100) | NO   |     |         |       |
| description | tinytext     | NO   |     |         |       |
| stock       | int(11)      | NO   | MUL |         |       |
| price       | float        | NO   |     |         |       |
+-------------+--------------+------+-----+---------+-------+

Si queremos obtener un registro, el codigo “normal” es el siguiente

import MySQLdb
cnx = MySQLdb.connect('localhost', 'user', 'passwd', 'db')
c = cnx.cursor()

c.execute("SELECT * FROM inventory")
row = c.fetchone()
print repr(row)

Con lo cual obtendremos una tupla como la siguiente:

('5*99955*1', 'frijoles', 'frijoles bayos marca chonita', 50L, 10.55)

Aqui me nacio un problemilla. Yo estoy acostumbrado (mucho) a trabajar con PHP. PHP tiene la funcion mysql_fetch_array, el cual te devuelve un arreglo asociativo (o lo que los pythoneros llaman diccionario) en donde la llave es el nombre de la columna. Este es extremadamente util, sobretodo en tablas grandes, en donde es dificil recordar en que posicion del arreglo o tupla va cada elemento.

Como ya tenia una buena cantidad de codigo, queria encontrar una solucion elegante a mi problema, y si lo encontre :D

import MySQLdb
cnx = MySQLdb.connect('localhost', 'user', 'passwd', 'db')
c = cnx.cursor(MySQLdb.cursors.DictCursor)

c.execute("SELECT * FROM inventory")
row = c.fetchone()
print repr(row)

Con lo cual obtenemos una salida como la siguiente:

{'price': 10.55, 'description': 'frijoles bayos marca chonita', 'stock': 50L, 'id': '5*99955*1', 'name': 'frijoles'}

Lo cual ya es mucho mas manejable al momento de programar.

Mis 2 centavos…


About this entry