使用MySQL Connector更新数据库详情时遇到'TypeError: 'NoneType' object is not subscriptable'错误求助
解决MySQL Connector报错:TypeError: 'NoneType' object is not subscriptable
这个报错的根源很明确:你在循环遍历SELECT查询结果的过程中,复用了同一个cursor对象去执行UPDATE语句,这会直接清空之前SELECT生成的结果集。当循环尝试获取下一条数据时,cursor内部的_rows已经变成了None,自然就触发了“不能对None做下标操作”的错误——哪怕你设置了buffered=True也没用,因为同一个cursor执行新的SQL语句后,旧的结果集就会被释放。
给你两个简单有效的解决办法:
方法一:提前读取所有查询结果
先把SELECT的结果全部取出来存到一个列表里,之后遍历这个列表处理更新,这样cursor的后续操作就不会影响到已经拿到的结果:
def getRepos(): cursor.execute("select repo_name,github_id from user_repo WHERE Processed = 'N'") # 一次性取出所有结果存入列表 repos_list = cursor.fetchall() for repo in repos_list: username = repo[1] repo_name = repo[0] total_commit = total_commit_fetch_web_scrap(repo_name, username) total_commit_user = total_commit_user_func(repo_name, username) total_contributors = total_contributors_func(repo_name, username) language_dict = {} fetch_language(username, repo_name, language_dict) sql = 'UPDATE user_repo SET contributors=%s, total_commits=%s, commit_by_user=%s, language_1=%s, language_2=%s, language_3=%s, language_4=%s, language_5=%s, language_6=%s, language_7=%s WHERE repo_name=%s AND github_id=%s;' val = (total_contributors, total_commit, total_commit_user, language_dict['languages1'], language_dict['languages2'], language_dict['languages3'], language_dict['languages4'], language_dict['languages5'], language_dict['languages6'], language_dict['languages7'], repo_name, username) cursor.execute(sql,val) connection.commit()
方法二:使用两个独立的cursor
创建两个不同的cursor对象,一个专门负责执行SELECT查询和遍历结果,另一个专门处理UPDATE操作,这样两个操作的结果集完全不会互相干扰:
def getRepos(): # 分别创建查询和更新用的cursor select_cursor = connection.cursor(buffered=True) update_cursor = connection.cursor() select_cursor.execute("select repo_name,github_id from user_repo WHERE Processed = 'N'") for repo in select_cursor: username = repo[1] repo_name = repo[0] total_commit = total_commit_fetch_web_scrap(repo_name, username) total_commit_user = total_commit_user_func(repo_name, username) total_contributors = total_contributors_func(repo_name, username) language_dict = {} fetch_language(username, repo_name, language_dict) sql = 'UPDATE user_repo SET contributors=%s, total_commits=%s, commit_by_user=%s, language_1=%s, language_2=%s, language_3=%s, language_4=%s, language_5=%s, language_6=%s, language_7=%s WHERE repo_name=%s AND github_id=%s;' val = (total_contributors, total_commit, total_commit_user, language_dict['languages1'], language_dict['languages2'], language_dict['languages3'], language_dict['languages4'], language_dict['languages5'], language_dict['languages6'], language_dict['languages7'], repo_name, username) update_cursor.execute(sql,val) connection.commit() # 使用完毕后关闭cursor,养成好习惯 select_cursor.close() update_cursor.close()
两种方法都能解决你的问题,选哪个看你个人习惯——方法一更简洁,方法二更清晰,适合复杂场景下区分不同操作的职责。
内容的提问来源于stack exchange,提问作者lex
相关产品推荐
相关产品推荐

