This post describes how to make a custom cursor returning rows as dictionaries using MySQL Connctor/Python v0.2 (or later).
Problem: you want to fetch rows from the database and return them as a dictionary with keys being the column names.
First, lets check how you would do it without any custom cursor.
cnx = mysql.connector.connect(host='localhost',database='test') cur = cnx.cursor() cur.execute("SELECT c1, c2 FROM t1") result = [] columns = tuple( [d[0].decode('utf8') for d in cur.description] ) for row in cur: result.append(dict(zip(columns, row))) pprint(result) cur.close() cnx.close()
The above results in an output like this:
[{u'c1': datetime.datetime(2010, 10, 13, 8, 55, 35), u'c2': u'ham'}, {u'c1': datetime.datetime(2010, 10, 13, 8, 55, 38), u'c2': u'spam'}]
Alternatively, you can code your own cursor which will return a row as a dictionary. Here is an example on how to do this:
import mysql.connector class MySQLCursorDict(mysql.connector.cursor.MySQLCursor): def fetchone(self): row = self._fetch_row() if row: return dict(zip(self.column_names, self._row_to_python(row))) return None
What we did is subclassing MySQLCursor and overload the fetchone()-method. To use the above, you can do following:
cnx = mysql.connector.connect(host='localhost',database='test') cur = cnx.cursor(cursor_class=MySQLCursorDict) cur.execute("SELECT c1, c2 FROM t1") rows = cur.fetchall() pprint(rows) cur.close() cnx.close()
The trick is to pass the cursor_class-argument when creating the cursor. (At the time of writing, I realize that the cursor_class should be part of the connection arguments to set a default for all requested cursors. We’ll change that.)
It’s a bit more elegant coding and possibilities are endless. Maybe you’d like a cursor which returns a row in XML for example.
PlanetMySQL Voting: Vote UP / Vote DOWN