Python中cursor.fetchall()返回空列表:MySQL批量查询失败问题
批量查MySQL数据为空?问题出在这
为啥executemany查不到数据
executemany() 是给批量写操作(INSERT/UPDATE/DELETE)设计的,用来循环执行多条写SQL效率更高。但你拿它跑SELECT的话,坑就来了:它确实会循环执行每条查询,但cursor只会保留最后一次执行的结果。
比如你那四条id里,如果最后一条PK-YSG-23004在库中不存在,那fetchall()就返回空;就算最后一条存在,也只会返回那一条,不是四条的结果。这就是你批量查空、单条查得到的原因。
正确的批量查询姿势
用IN子句写单条SQL,一次性查所有目标id,这才是批量查询的正确方式:
import mysql.connector mysql_config={ 'user' : 'root', 'password' : '*********', 'host' : '*******', 'database' : 'aa_dev', 'port' : 3306 } # 整理要查的id列表,用IN子句构建SQL target_ids = ['PK-YSG-23001', 'PK-YSG-23002', 'PK-YSG-23003', 'PK-YSG-23004'] # 生成对应数量的占位符,避免SQL注入 placeholders = ', '.join(['%s'] * len(target_ids)) sql = f"SELECT idfi, aircraft, file_location FROM flights_info WHERE idfi IN ({placeholders})" mydb = mysql.connector.connect(**mysql_config) mycursor = mydb.cursor() mycursor.execute(sql, target_ids) results = mycursor.fetchall() # 记得关闭资源 mycursor.close() mydb.close() print(results) # 现在能拿到所有匹配的记录了
额外提醒
- 永远别用
executemany()执行SELECT,效率低还容易踩结果集的坑。 - 如果要查的id数量特别多(比如上万条),可以拆成多个小批次用IN查询,避免触发MySQL的
max_allowed_packet限制。
内容的提问来源于stack exchange,提问作者Satria Muhammad Saglan
相关产品推荐
相关产品推荐

