Python For循环遍历列表元素时SQL重复插入数据问题如何解决
问题产生原因
- 循环取值逻辑错误:遍历
listA时没有使用每次迭代返回的单条元组数据,直接索引整个列表的固定位置,你写的listA[0]、listA[1]是取整个列表的第1、第2个元组,不是当前循环到的元组的两个字段。 - 参数传递逻辑缺失:
fetchdata和upload都没有定义入参,全程依赖全局变量传值,极易出现变量污染,多次调用后出现值覆盖或者重复读取的问题。 - 请求构造错误:
requests.requests('GET', base_url+params)的写法完全错误,首先requests模块下没有requests方法,其次参数不能直接和URL字符串拼接,会导致countryname参数没有正确传递,大概率拉取到了全量国家数据,上传时把所有数据都插一遍,循环多少次就重复插入多少次。 - 变量名不规范:定义的列表是
listA(大写A),循环时写的是lista(小写a),部分编程语言会判定为两个不同变量,可能触发意料之外的遍历逻辑。 - 上传逻辑无隔离:
upload里的SQL插入逻辑没有绑定当前唯一的国家ID,也没有做去重校验,每次调用可能把之前缓存的所有国家数据都重复插入一次。
修复方案
修改后的可运行代码如下:
import requests # 国家名是字符串需要加引号 listA = [('UK',1),('USA',2),('UAE',3)] # 给fetchdata添加国家名入参,仅返回当前国家的拉取结果 def fetchdata(country): base_url = 'someurl.com' params = {'countryname' : country} # 修正请求写法,正确传递参数 resp = requests.get(base_url, params=params).json() # 按实际返回结构取对应数值,这里假设返回字段为value return resp.get('value') # 给upload添加入参,仅插入当前传入的单条数据 def upload(country, id, value): # SQL插入仅使用传入的三个参数,不要读取全局变量存储的历史数据 # 示例SQL:INSERT INTO 表名 (Country,ID,value) VALUES (%s,%s,%s),传入参数对应(country,id,value) pass # 修正循环逻辑,每次取当前迭代的元组元素 for item in listA: country = item[0] current_id = item[1] current_value = fetchdata(country) upload(country, current_id, current_value)
- 如果修改后仍有重复,可以在SQL插入前加前置校验,先查询当前ID对应的数据是否已经存在,不存在再执行插入。
- 也可以直接给SQL表的ID字段加唯一索引,从库层面避免重复数据写入。
内容的提问来源于stack exchange,提问作者plshelpmeimpoor
相关产品推荐
相关产品推荐

