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
相关产品推荐
相关产品推荐

