Как я могу получить dict из запроса sqlite? - PullRequest
91 голосов
/ 21 июля 2010
db = sqlite.connect("test.sqlite")
res = db.execute("select * from table")

С помощью итерации я получаю списки, соответствующие ядру строк.

for row in res:
    print row

Я могу получить название столбцов

col_name_list = [tuple[0] for tuple in res.description]

Но есть ли какая-либо функция или настройка для получения словарей вместо списка?

{'col1': 'value', 'col2': 'value'}

или я должен сделать сам?

Ответы [ 12 ]

0 голосов
/ 13 октября 2015

Общая альтернатива, использующая всего три строки

def select_column_and_value(db, sql, parameters=()):
    execute = db.execute(sql, parameters)
    fetch = execute.fetchone()
    return {k[0]: v for k, v in list(zip(execute.description, fetch))}

con = sqlite3.connect('/mydatabase.db')
c = con.cursor()
print(select_column_and_value(c, 'SELECT * FROM things WHERE id=?', (id,)))

Но если ваш запрос ничего не даст, это приведет к ошибке. В этом случае ...

def select_column_and_value(self, sql, parameters=()):
    execute = self.execute(sql, parameters)
    fetch = execute.fetchone()

    if fetch is None:
        return {k[0]: None for k in execute.description}

    return {k[0]: v for k, v in list(zip(execute.description, fetch))}

или

def select_column_and_value(self, sql, parameters=()):
    execute = self.execute(sql, parameters)
    fetch = execute.fetchone()

    if fetch is None:
        return {}

    return {k[0]: v for k, v in list(zip(execute.description, fetch))}
0 голосов
/ 22 августа 2014

Или вы можете преобразовать sqlite3.Rows в словарь следующим образом. Это даст словарь со списком для каждой строки.

    def from_sqlite_Row_to_dict(list_with_rows):
    ''' Turn a list with sqlite3.Row objects into a dictionary'''
    d ={} # the dictionary to be filled with the row data and to be returned

    for i, row in enumerate(list_with_rows): # iterate throw the sqlite3.Row objects            
        l = [] # for each Row use a separate list
        for col in range(0, len(row)): # copy over the row date (ie. column data) to a list
            l.append(row[col])
        d[i] = l # add the list to the dictionary   
    return d
...