How can I get dict from sqlite query? How can I get dict from sqlite query? python python

How can I get dict from sqlite query?


You could use row_factory, as in the example in the docs:

import sqlite3def dict_factory(cursor, row):    d = {}    for idx, col in enumerate(cursor.description):        d[col[0]] = row[idx]    return dcon = sqlite3.connect(":memory:")con.row_factory = dict_factorycur = con.cursor()cur.execute("select 1 as a")print cur.fetchone()["a"]

or follow the advice that's given right after this example in the docs:

If returning a tuple doesn’t suffice and you want name-based access to columns, you should consider setting row_factory to the highly-optimized sqlite3.Row type. Row provides both index-based and case-insensitive name-based access to columns with almost no memory overhead. It will probably be better than your own custom dictionary-based approach or even a db_row based solution.


I thought I answer this question even though the answer is partly mentioned in both Adam Schmideg's and Alex Martelli's answers. In order for others like me that have the same question, to find the answer easily.

conn = sqlite3.connect(":memory:")#This is the important part, here we are setting row_factory property of#connection object to sqlite3.Row(sqlite3.Row is an implementation of#row_factory)conn.row_factory = sqlite3.Rowc = conn.cursor()c.execute('select * from stocks')result = c.fetchall()#returns a list of dictionaries, each item in list(each dictionary)#represents a row of the table


Even using the sqlite3.Row class-- you still can't use string formatting in the form of:

print "%(id)i - %(name)s: %(value)s" % row

In order to get past this, I use a helper function that takes the row and converts to a dictionary. I only use this when the dictionary object is preferable to the Row object (e.g. for things like string formatting where the Row object doesn't natively support the dictionary API as well). But use the Row object all other times.

def dict_from_row(row):    return dict(zip(row.keys(), row))