Обработка mysql результат в python 3 - PullRequest
1 голос
/ 06 января 2020

Я новичок в этом форуме, прошу прощения, если формат вопроса не очень хороший.

Я пытаюсь получить строки из таблицы базы данных в mysql и вывести их после обработки столбцов. (один из столбцов содержит json, который необходимо расширить). Ниже приведен источник и ожидаемый результат. Было бы замечательно, если бы кто-то мог предложить более простой способ управления этими данными.

Примечание: я достиг этого с большим количеством циклов и разборов, но проблемы заключаются.
1) Нет никакой связи между col_names и данные и, следовательно, когда я печатаю данные, я не знаю порядок данных в наборе результатов, поэтому существует несоответствие в заголовке столбца, который я печатаю, и данных, любые средства, чтобы сохранить это в синхронизации c?
2) Я хотел бы иметь возможность изменять порядок столбцов без особых переделок.

Какой наилучший из возможных способов добиться этого. Не изучал библиотеку pandas, поскольку я не был уверен, действительно ли это необходимо.

Использование 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'

1 Ответ

1 голос
/ 09 января 2020

Не слишком-Pythoni c способ, но простой для понимания (и, возможно, вы можете написать более Pythoni c решение) может быть:

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)
...