如何将SQL查询结果转换为Python字典

oprakyz7  于 2023-06-20  发布在  Python
关注(0)|答案(9)|浏览(153)

我很难将我的查询结果转换为Python字典。每个字典都应该代表一个学生,键是列名,值是查询中对应的值,到目前为止,这是我得出的结论:

def all_students():
    qu= 'select * from students'
    crs.execute(qu)
    for row in crs:
        student= {"StudentNum":row[0], "StudentLastName":row[2], "StudentFirst Name":row[3}
    return student

但是当我打印它的时候,它返回正确的信息并且所有东西都乱了序,它只显示一条记录:

{'StudentLastName': Jane, StudentNum: 'Smith  ', StudentFirst Name: '1612'}
roejwanj

roejwanj1#

此时你可能已经解决了你的问题,但无论如何:
如果你使用mysql,我认为这是你需要的:
https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursordict.html
根据定义:* MySQLCursorDict游标将每一行作为字典返回。每个字典对象的键是MySQL结果的列名。*
所以你必须只设置crs = cnx.cursor(dictionary=True)
希望有帮助

o0lyfsai

o0lyfsai2#

也许这可以帮助:http://codetrace.blogspot.com/2010/05/convert-query-result-to-dictionary-like.html

query_result = [ dict(line) for line in [zip([ column[0] for column in crs.description], row) for row in crs.fetchall()] ]

print query_result
7jmck4yq

7jmck4yq3#

我希望这能帮上忙。。

def all_students():
    qu= "select * from students"
    students = crs.execute(qu)
    students_data = []
    for row in students:
        student= {"StudentNum":row[0], "StudentLastName":row[2], "StudentFirst Name":row[3}
         students_data.append(student)

    final_data["students_info"] = students_data
    return final_data
x8goxv8g

x8goxv8g4#

要回答最初的问题,您可以尝试以下方法(不需要循环crs,您可以直接使用crs.fetchall(),前提是表内容适合您的内存):
result_list_of_dict = [{'StudentNum': col1, 'StudentLastName': col2, 'StudentFirst Name': col3} for (col1, col2, col3) in crs.fetchall()]
结果result_list_of_dict是一个字典列表,每个元素(字典)将有3个您指定的键('StudentNum','StudentLastName'和'StudentFirst Name')以及从SQL表中提取的相关值。

扩展:

基本上,cursor.fetchall()返回一个元组列表,所以只要列出所有应该返回的值,就可以随意修改前面的部分。例如,下面的代码将适用于一个包含5列的表,您希望仅提取前3列:
result_dict = {col1:(col2, col3) for (col1, col2, col3, col4, col5) in cursor.fetchall()}
在这种情况下,结果result_dict将是一个字典。

e4eetjau

e4eetjau5#

得票最多的是python2,下面是python3的答案:

import itertools

desc = cursor.description
column_names = [col[0] for col in desc]
data = [dict(zip(column_names, row))  
        for row in cursor.fetchall()]
bmvo0sr5

bmvo0sr56#

如果你希望查询返回一个单个结果,并且你希望字典中的所有值都按它们的列名,你可以用途:

def querySingle(sql, args):
    try:
        cursor = cnx.cursor()
        cursor.execute(sql, args)
        for row in cursor:
            return dict((column[0],row[index]) for index, column in enumerate(cursor.description))
        return {}
    finally:
        cursor.close()

例如,querySingle("SELECT * FROM animals WHERE id=%s", [1])可能返回:

{
    "id": 1,
    "name": "Bob",
    "type": "Alligator"
}
如何工作

cursor.description返回所有列的数组,其中每个条目都是一个数组,其中第一个值是列的名称。使用enumerate,给出每一列沿着索引。然后,只需创建一个字典,名称来自column[0]沿着数据来自row[index]。在for循环中返回确保只处理第一行。

oipij1gg

oipij1gg7#

result = db_pool.execute(query,return_dict=True)

7cjasjjr

7cjasjjr8#

如果你来自哈佛大学的cs50课程,SELECT查询返回一个列表,其中每行由Python dict表示,其中键对应于列名,值来自表。
你不需要转换它。

dxxyhpgq

dxxyhpgq9#

你可以使用cursor.description来获取列名,并“压缩”列名列表,每个返回的行都会产生一个字典列表:

import itertools

desc = cursor.description
column_names = [col[0] for col in desc]
data = [dict(itertools.izip(column_names, row))  
        for row in cursor.fetchall()]

注意:在Python3上使用zip()代替itertools.izip()

相关问题