Python操作MySQL查询参数处理失败及未读结果报错问题
解决MySQL Connector的两个常见错误
第一个错误:ProgrammingError: Could not process parameters: str(555), it must be of type list, tuple or dict
问题出在参数传递的格式上:(song_id) 不是元组,Python会把它解析成单个变量而非元组类型。而cursor.execute()要求参数必须是列表、元组或字典,所以触发了这个报错。
解决方法很简单,给参数加个逗号,写成(song_id,),这样Python才会把它识别为单元素元组:
cursor.execute("SELECT s_title FROM SONG WHERE s_id = (%s)", (song_id,))
你提到INSERT操作没报错,是因为INSERT时你传递的大概率是多元素元组(比如(user_id, song_name)),天然符合参数格式要求,所以没触发这个问题。
第二个错误:InternalError: Unread result found
这个错误是因为你在同一个cursor对象上连续执行查询,第一个查询的结果还没完成状态清理,就启动了新的查询,导致游标状态冲突。
有两种实用的解决方式:
方式1:使用缓冲游标(buffered cursor)
创建cursor时指定buffered=True,让游标把第一个查询的结果全部缓存起来,不影响后续查询:
cursor = conn.cursor(buffered=True) # conn是你的数据库连接对象 cursor.execute('SELECT * FROM LIBS') result = cursor.fetchall() for row in result: user_id = row[0] song_id = row[1] if user_id == userno: cursor.execute("SELECT s_title FROM SONG WHERE s_id = (%s)", (song_id,)) song_title = cursor.fetchone()[0] # 记得取出查询结果 print(song_title)
方式2:创建两个独立的游标
用两个不同的cursor分别处理两次查询,互相不干扰:
# 创建两个独立游标 cursor_libs = conn.cursor() cursor_song = conn.cursor() cursor_libs.execute('SELECT * FROM LIBS') result = cursor_libs.fetchall() for row in result: user_id = row[0] song_id = row[1] if user_id == userno: cursor_song.execute("SELECT s_title FROM SONG WHERE s_id = (%s)", (song_id,)) song_title = cursor_song.fetchone()[0] print(song_title) # 用完关闭游标 cursor_libs.close() cursor_song.close()
额外提醒
你原来的代码里执行第二个SELECT后没有取出结果,即使没报错也拿不到数据,记得用fetchone()或fetchall()把查询结果提取出来。
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

