You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中MySQL嵌套查询及fetchall结果格式处理问题

Python操作MySQL:处理fetchall结果与嵌套查询实现

问题1:转换fetchall结果为适合MySQL IN子句的格式

fetchall()返回的是元组组成的列表,每个元组对应数据库查询的一行结果(这里每行仅包含一个uuid字段,所以格式为(uuid_str,))。要将其转换为IN子句所需的格式,可按以下方式处理:

方式1:字符串拼接(需注意SQL注入风险)

nameofthecard = "Tim Bogard"
# 替换原拼接写法为参数化查询,避免SQL注入
mysql_look_query_2 = """SELECT uuid FROM cards WHERE name = %s"""
mycursor.execute(mysql_look_query_2, (nameofthecard,))
myresult_2 = mycursor.fetchall()

# 提取所有uuid字符串
uuid_list = [row[0] for row in myresult_2]
# 格式化为带单引号的逗号分隔字符串
formatted_uuids = "', '".join(uuid_list)
# 构建最终查询语句
mysql_look_query_3 = f"""SELECT price FROM prices WHERE uuid IN ('{formatted_uuids}')"""
mycursor.execute(mysql_look_query_3)
myresult_3 = mycursor.fetchall()
print(myresult_3)

方式2:参数化查询(推荐,彻底避免SQL注入)

这是更安全的写法,无需手动处理字符串格式:

nameofthecard = "Tim Bogard"
mysql_look_query_2 = """SELECT uuid FROM cards WHERE name = %s"""
mycursor.execute(mysql_look_query_2, (nameofthecard,))
myresult_2 = mycursor.fetchall()

uuid_list = [row[0] for row in myresult_2]
# 生成与uuid数量匹配的占位符%s
placeholders = ", ".join(["%s"] * len(uuid_list))
mysql_look_query_3 = f"""SELECT price FROM prices WHERE uuid IN ({placeholders})"""
# 执行时直接传入uuid列表作为参数
mycursor.execute(mysql_look_query_3, uuid_list)
myresult_3 = mycursor.fetchall()
print(myresult_3)

问题2:实现嵌套查询(子查询)

无需拆分两次查询,直接在SQL中嵌套子查询即可,性能更优且代码更简洁:

nameofthecard = "Tim Bogard"
# 嵌套查询SQL:在IN子句中直接嵌套查询uuid的逻辑
mysql_look_query = """
SELECT price FROM prices 
WHERE uuid IN (
    SELECT uuid FROM cards WHERE name = %s
)
"""
# 参数化传入name参数,杜绝SQL注入风险
mycursor.execute(mysql_look_query, (nameofthecard,))
myresult = mycursor.fetchall()
print(myresult)

重要提示

  • 禁止直接将用户输入拼接进SQL语句,会引发SQL注入漏洞,必须使用参数化查询(用%s做占位符,执行时传入参数元组)。
  • 数据库引擎会自动优化嵌套查询的执行逻辑,性能优于两次独立查询。

内容的提问来源于stack exchange,提问作者erotski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 19:43:09