SQL数据读取字典循环异常:仅生成单个键值对求助
问题根源及修正方案
核心问题
- 循环提前终止:你把
return dict0写在了for循环内部,第一次循环执行到这里就直接退出函数,后续SQL脚本完全没机会运行,这是只生成1个键的根本原因。 - 数据取值错误:
dict0[j] = ling[j]是取查询结果的第j行,但你应该是要把整个查询结果存入字典,改成dict0[j] = ling才符合需求。 - 无效代码块:
out1的定义和dict1的循环都在return之后,永远不会被执行;而且out变量处于注释状态,运行时会直接报错。 - 全局变量冗余:使用
global dict0完全没必要,函数直接返回结果即可,全局变量容易引发不必要的副作用。
修正后的代码
import pandas as pd x = """SQL_script_1""" y = """SQLscript_2""" ting = [x, y] def creator(SQL_scripts): cur = con.cursor() result_dict = {} # 用enumerate更简洁地获取索引和对应脚本 for idx, script in enumerate(SQL_scripts): cur.execute(script) # 获取当前查询的全部结果 query_data = cur.fetchall() # 获取查询结果的列名 columns = [desc[0] for desc in cur.description] # 直接将结果转为DataFrame并存入字典 result_dict[idx] = pd.DataFrame(query_data, columns=columns) cur.close() # 用完游标记得关闭,避免资源泄漏 return result_dict # 调用函数获取最终字典 data_dict = creator(ting) # 若需要将所有字典值合并为一个大DataFrame combined_df = pd.concat(data_dict.values(), ignore_index=True)
关键调整说明
- 将
return语句移至for循环外部,确保所有SQL脚本都能执行完毕。 - 用
enumerate替代zip(SQLscript, range(len(SQLscript))),遍历列表时直接获取索引和元素,代码更简洁易读。 - 直接将查询结果转为DataFrame,省去中间转列表再转字典的冗余步骤,提升效率。
- 移除全局变量,改用函数返回值传递结果,代码逻辑更健壮。
若需先转列表再生成字典(按你最初计划)
可以把DataFrame转换部分替换为以下逻辑:
# 将查询结果的元组转为列表 data_list = [list(row) for row in query_data] # 生成以列名为键的字典 col_dict = {col: [row[i] for row in data_list] for i, col in enumerate(columns)} # 转为DataFrame df = pd.DataFrame(col_dict) result_dict[idx] = df
内容的提问来源于stack exchange,提问作者MrWednesday
相关产品推荐
相关产品推荐

