Python中如何将MySQL查询返回的ID用于另一个查询?
Python中如何将MySQL查询返回的ID用于另一个查询?
嗨,我来帮你理清楚这个问题~你遇到的错误其实很典型,咱们一步步解决:
首先,你得搞懂cursor.fetchall()返回的是什么——它返回的是由字典组成的列表,不是单个字典!所以你直接写questionslist['question_id']肯定会报错,因为列表只能用整数索引,不能用字符串当索引。
那正确的做法应该是先从这个列表里把所有的question_id提取出来,变成一个纯ID的列表,再用这个列表去做IN查询。
步骤1:修正第一个查询的小问题
先提一句,你第一个execute语句里的参数括号写错了,应该是这样(注意逗号,因为参数需要是元组):
qresult = cursor.execute('SELECT * FROM questions WHERE category_id=%s', (category_id,)) questionslist = cursor.fetchall()
步骤2:提取所有question_id
用列表推导式就能轻松把所有ID捞出来:
# 遍历questionslist里的每个字典,提取question_id question_ids = [q['question_id'] for q in questionslist]
这样question_ids就是类似[1, 2]这样的纯ID列表了。
步骤3:构造并执行第二个IN查询
MySQL的IN子句需要对应数量的占位符,咱们可以动态生成这些占位符,既安全又灵活:
if not question_ids: # 防止没有查询到任何问题的情况,避免生成无效SQL choices_list = [] else: # 生成和ID数量一致的%s占位符,比如两个ID就是%s,%s placeholders = ','.join(['%s'] * len(question_ids)) # 拼接SQL语句 query = f'SELECT * FROM choices WHERE question_id IN ({placeholders})' # 执行查询,把question_ids作为参数传进去 cresult = cursor.execute(query, question_ids) choices_list = cursor.fetchall()
为什么要这么做?
用动态生成占位符的方式,既避免了手动拼接字符串带来的SQL注入风险,又能完美匹配所有从第一个查询得到的question_id。
备注:内容来源于stack exchange,提问作者husain
相关产品推荐
相关产品推荐

