Search code examples
pythonmysqlsqlitedictionarydataformat

Python - mysqlDB, sqlite result as dictionary


When I do someting like

sqlite.cursor.execute("SELECT * FROM foo")
result = sqlite.cursor.fetchone()

I think have to remember the order the columns appear to be able to fetch them out, eg

result[0] is id
result[1] is first_name

is there a way to return a dictionary? so I can instead just use result['id'] or similar?

The problem with the numbered columns is, if you write your code then insert a column you might have to change the code eg result[1] for first_name might now be a date_joined so would have to update all the code...


Solution

  • David Beazley has a nice example of this in his Python Essential Reference.
    I don't have the book at hand, but I think his example is something like this:

    def dict_gen(curs):
        ''' From Python Essential Reference by David Beazley
        '''
        import itertools
        field_names = [d[0].lower() for d in curs.description]
        while True:
            rows = curs.fetchmany()
            if not rows: return
            for row in rows:
                yield dict(itertools.izip(field_names, row))
    

    Sample usage:

    >>> import sqlite3
    >>> conn = sqlite3.connect(':memory:')
    >>> c = conn.cursor()
    >>> c.execute('create table test (col1,col2)')
    <sqlite3.Cursor object at 0x011A96A0>
    >>> c.execute("insert into test values (1,'foo')")
    <sqlite3.Cursor object at 0x011A96A0>
    >>> c.execute("insert into test values (2,'bar')")
    <sqlite3.Cursor object at 0x011A96A0>
    # `dict_gen` function code here
    >>> [r for r in dict_gen(c.execute('select * from test'))]
    [{'col2': u'foo', 'col1': 1}, {'col2': u'bar', 'col1': 2}]