【问题标题】:How to convert SQL query results into a python dictionary如何将 SQL 查询结果转换为 python 字典
【发布时间】:2015-02-27 00:34:23
【问题描述】:

我很难将我的查询结果转换为 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'}

【问题讨论】:

    标签: python sql dictionary


    【解决方案1】:

    您可以使用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()

    【讨论】:

    • 对于最后一行,您可以使用for row in cursor 而不是cursor.fetchall() 并获得相同的结果。
    • 看起来 itertools.izip 在 Python 3 中不可用,但简单的 zip 可以工作
    • 在 Python 3 中,内置 zip 与 2.x 中的 izip 执行相同的工作(返回生成器而不是列表),但速度稍快,因为它是内置函数。
    • 模块“itertools”没有“zip”成员
    • @RickLan 当然,为 python3 添加了注释。
    【解决方案2】:

    此时你可能解决了你的问题,但无论如何:

    如果您使用的是 mysql,我认为这就是您所需要的:

    https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursordict.html

    根据定义:MySQLCursorDict 游标将每一行作为字典返回。每个字典对象的键是 MySQL 结果的列名。

    所以你必须只设置 crs = cnx.cursor(dictionary=True)

    希望对你有帮助

    【讨论】:

      【解决方案3】:

      也许这会有所帮助: 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
      

      【讨论】:

        【解决方案4】:

        我希望这会有所帮助...

        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
        

        【讨论】:

          【解决方案5】:

          回答原题,可以试试下面的方法(不用循环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() 返回一个元组列表,因此只要您列出所有应该返回的值,您就可以随意修改前面的部分。例如,以下代码适用于您只想提取前 3 列的 5 列表:

          result_dict = {col1:(col2, col3) for (col1, col2, col3, col4, col5) in cursor.fetchall()}

          在这种情况下,结果 result_dict 将改为字典。

          【讨论】:

          • 您能解释一下为什么会这样吗?这段代码在做什么?它是如何回答问题的?
          • 我进行了更改以增加与原始问题的相关性
          • 只有这个答案返回字典;其他人返回字典列表!
          【解决方案6】:

          如果您来自哈佛的 cs50 课程,SELECT 查询会返回一个列表,其中每行由 Python dict 表示,其中键对应于列名,值来自表。

          你不需要转换它。

          【讨论】:

            猜你喜欢
            • 2010-10-31
            • 1970-01-01
            • 1970-01-01
            • 2021-08-21
            • 1970-01-01
            • 2012-12-18
            • 1970-01-01
            • 2010-09-17
            • 1970-01-01
            相关资源
            最近更新 更多