Generating a Dictionary Mapping from Field Names to Column Numbers
Credit: Tom Jenkins
Problem
You want to access data fetched from a DB API cursor object, but you want to access the columns by field name, not by number.
Solution
Accessing columns within a set of database-fetched rows by column
index is neither readable nor robust if columns are ever reordered.
This recipe exploits the description attribute of
Python DB API’s cursor objects to
build a dictionary that maps column names to index values, so you can
use cursor_row[field_dict[fieldname]] to get the
value of a named column:
def fields(cursor):
""" Given a DB API 2.0 cursor object that has been executed, returns
a dictionary that maps each field name to a column index; 0 and up. """
results = {}
column = 0
for d in cursor.description:
results[d[0]] = column
column = column + 1
return resultsDiscussion
When you get a set of rows from a call to:
cursor.fetch{one, many, all}it is often helpful to be able to access a specific column in a row by the field name and not by the column number. This recipe shows a function that takes a DB API 2.0 cursor object and returns a dictionary with column numbers keyed to field names.
Here’s a usage example (assuming you put this
recipe’s code in a module that you call
dbutils.py
somewhere on your sys.path):
>>> c = conn.cursor( )
>>> c.execute('''select * from country_region_goal where
crg_region_code is null''')
>>> import pprint
>>> pp = pprint.pprint
>>> pp(c.description)
(('CRG_ID', 4, ...