首页 > 解决方案 > 如何将查询结果格式化为我的扩展字典对象?

问题描述

我有 SQL 表:

问题

q_id (PK) 用户ID(FK用户(用户ID)) 问题
1 111 “1到4之间是什么?”
2 222 “5到7之间是什么?”

回答

a_id (PK) q_id(FK 问题(q_id)) 回答
1 1 '2'
2 1 '3'
3 2 '6'

在 Python 中,我扩展了 dict 以便它具有预定义的问题和答案键:

class MyQuestion(dict):
    def __init__(self, question, answers):
        self['question'] = question
        self['answers'] = answers

我的目标是最终得到一个 MyQuestion 对象列表(question_list)。目前我正在做这样的事情并且它有效:

question_list = []
cursor.execute("SELECT q_id, question FROM question WHERE user_id =(%s)", userID)
result = cursor.fetchall()
   for question in result:
     cursor.execute("SELECT answer FROM answers WHERE q_id = (%s)", question[0])
     answers = cursor.fetchall()
     question_list.append(MyQuestion( question[1], answers ) )

我想对此进行修改,以便只需要进行一个查询。因此,我创建了一个查询,可以获取用户提出的每个问题的所有答案,并且我想要与上述相同的结果。

SELECT answer.answer, question.question
FROM answer 
Left JOIN question on answer.q_id=question.q_id 
WHERE question.user_id = (%s), userID)

如何格式化我的 MyQuestions 对象列表的结果?

标签: pythonsql

解决方案


cursor.execute("SELECT answer.answer, question.question FROM answer Left JOIN question on answer.q_id=question.q_id WHERE question.user_id = (%s)", userID)
result = cursor.fetchall()
question_list = []
my_questions = {}
    for answer in result:
        if answer[1] in my_questions.keys():
            my_questions[answer[1]]['answers'].append(answer[0])
        else:
            my_questions[answer[1]] = MyQuestion(answer[1], [answer[0]])
            
    question_list =  my_questions.value()

使用连接查询进行查询后,使用问题字符串作为键将结果组织到字典中。键也可以是 q_id。

对于查询中的每一行,如果问题已经作为键存在,则转到值 MyQuestion 对象并将答案附加到 MyQuestion['answer']。否则,将问题添加为具有新 MyQuestion 对象的键。

返回 MyQuestions 列表的 my_questions 字典的值。


推荐阅读