如何从SQLite查询中获取字典?

180
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'}

还是我必须自己去做?


可能是重复的问题:Python - mysqlDB,sqlite结果作为字典 - vy32
8
这个问题来自2010年7月,你链接的那个是2010年11月的。所以那个是重复的。而且顾名思义,相反的评论已经被放在那个帖子上了 :-) - aneroid
16个回答

1

我认为你走在了正确的道路上。让我们保持简单,完成你想要做的事情:

import sqlite3
db = sqlite3.connect("test.sqlite3")
cur = db.cursor()
res = cur.execute("select * from table").fetchall()
data = dict(zip([c[0] for c in cur.description], res[0]))

print(data)

这种方法的缺点是,如果你的表非常大,.fetchall() 会消耗大量内存。但对于处理仅有几千行文本和数字列的简单应用程序来说,这种简单的方法已经足够了。
对于重要的事情,你应该研究许多其他答案中提出的行工厂。

0

一种通用的替代方案,只需三行代码

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
def getUsers(self,assoc=False):
        result = self.cursor.execute("SELECT * FROM users").fetchall()
        result_len = len(result)
        if(result_len == False): return
        if(assoc != True):
            return result
        else:
            result_formated = []
            columns = [column[0] for column in self.cursor.description]
            for row in result:
                row_dict = {}
                i = 0
                # print(result_len)
                while(i <= result_len):
                    row_dict[columns[i]] = row[i]
                    i += 1
                result_formated.append(row_dict)
            return result_formated

我就把我的烂代码放在这里了


您的回答可以通过提供更多支持性信息来改善。请[编辑]以添加进一步的细节,例如引用或文档,以便其他人可以确认您的答案是正确的。您可以在帮助中心中找到有关编写良好答案的更多信息。 - Community

0

或者你可以将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

0
Python中的字典提供对其元素的任意访问。 因此,任何具有“名称”的字典,虽然在某种程度上可能很有用(即字段名称是什么),但是会“无序”地排列字段,这可能是不需要的。
最好的方法是将名称放入一个单独的列表中,然后根据需要自己将它们与结果组合起来。
try:
         mycursor = self.memconn.cursor()
         mycursor.execute('''SELECT * FROM maintbl;''')
         #first get the names, because they will be lost after retrieval of rows
         names = list(map(lambda x: x[0], mycursor.description))
         manyrows = mycursor.fetchall()

         return manyrows, names

还要记住,在所有方法中,名称都是您在查询中提供的名称,而不是数据库中的名称。例外是 SELECT * FROM

如果您唯一关心的是使用字典获取结果,则绝对可以使用 conn.row_factory = sqlite3.Row(已在另一个答案中说明)。


0
import sqlite3

db = sqlite3.connect('mydatabase.db')
cursor = db.execute('SELECT * FROM students ORDER BY CREATE_AT')
studentList = cursor.fetchall()

columnNames = list(map(lambda x: x[0], cursor.description)) #students table column names list
studentsAssoc = {} #Assoc format is dictionary similarly


#THIS IS ASSOC PROCESS
for lineNumber, student in enumerate(studentList):
    studentsAssoc[lineNumber] = {}

    for columnNumber, value in enumerate(student):
        studentsAssoc[lineNumber][columnNames[columnNumber]] = value


print(studentsAssoc)

结果肯定是正确的,但我不知道最好的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接