在Python3中处理mysql结果

2024-10-08 19:29:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我是这个论坛的新手,如果问题格式不是很好,请原谅

我试图从mysql中的数据库表中获取行,并在处理COL(其中一个COL包含需要扩展的json)后打印相同的行。以下是源和预期输出。如果有人能建议一种更简单的方法来管理这些数据,那就太好了

注意:我通过大量的循环和解析实现了这一点,但挑战是。
1) 列名称和数据之间没有联系,因此当我打印数据时,我不知道数据在结果集中的顺序,所以我打印的列标题和数据不匹配,有什么方法保持同步吗?
2) 我希望能够灵活地更改列的顺序,而无需太多返工

实现这一目标的最佳方式是什么。我没有探索熊猫图书馆,因为我不确定它是否真的有必要

使用python 3.6

表中的示例数据

id, student_name, personal_details, university
1, Sam, {"age":"25","DOL":"2015","Address":{"country":"Poland","city":"Warsaw"},"DegreeStatus":"Granted"},UAW
2, Michael, {"age":"24","DOL":"2016","Address":{"country":"Poland","city":"Toruń"},"DegreeStatus":"Granted"},NCU

我正在使用MySQLdb.connect对象查询数据库,步骤如下

query = "select * from student_details"
cur.execute(query)
res = cur.fetchall()  # get a collection of tuples 
db_fields = [z[0] for z in cur.description]  # generate list of col_names

变量中的数据:

>>>db_fields
['id', 'student_name', 'personal_details', 'university']
>>>res
((1, 'Sam', '{"age":"25","DOL":"2015","Address":{"country":"Poland","city":"Warsaw"},"DegreeStatus":"Granted"}','UAW'),
 (2, 'Michael', '{"age":"24","DOL":"2016","Address":{"country":"Poland","city":"Toruń"},"DegreeStatus":"Granted"}','NCU'))

期望输出:

 id, student_name, age, DOL, country, city, DegreeStatus, University
 1, 'Sam', 25, 2015, 'Poland', 'Warsaw', 'Granted', 'UAW'
 2, 'Michael', 24, 2016, 'Poland', 'Toruń', 'Granted', 'NCU'

Tags: 数据nameidcityageaddresssamdetails
1条回答
网友
1楼 · 发布于 2024-10-08 19:29:40

一种不太像python但容易理解的方式(也许你可以写一个更像python的解决方案)可能是:

def unwrap_dict(_input):
    res = dict()
    for k, v in _input.items():
        # Assuming you know there's only one nested level
        if isinstance(v, dict):
            for _k, _v in v.items():
                res[_k] = _v
            continue
        res[k] = v
    return res


all_data = list()
for row in result:
    res = dict()
    for field, data in zip(db_fields, row):
        # Assuming you know personal_details is the only JSON column
        if field == 'personal_details':        
            data = json.loads(data)
        if isinstance(data, dict):
            extra = unwrap_dict(data)
            res.update(extra)
            continue
        res[field] = data

    all_data.append(res)

相关问题 更多 >

    热门问题