将巴西邮编API返回的JSON数据插入SQLite数据库报错如何解决
问题修复方案
存在的错误点
- 直接遍历
requests.get()返回的Response对象,未先将响应解析为JSON格式。Response对象迭代返回的是字节流片段,因此用字符串键['cep']取值时触发TypeError: byte indices must be integers or slices, not str错误。 - 单次查询巴西邮编API返回的是单个JSON对象而非列表,无需使用
for循环遍历。 - INSERT语句语法错误,写死了
values (8, 5),未使用SQLite参数占位符?传递动态值。 commit()是数据库连接对象的方法,原代码错误调用了游标对象的commit(),无法完成事务提交。cep字段定义为int(8)不符合API返回格式,API返回的邮编带-分隔符(如05565-000),需将字段类型改为TEXT才能保留原始格式,若要存储数值需先去除分隔符再转换为整数。- 原代码请求URL的字符串引号不匹配,
format方法写在了字符串外部,会导致请求异常。
修正后可运行代码
import requests import sqlite3 import json print('识别邮编信息') CEPC = input('请输入邮编:') # 修正请求URL写法 response = requests.get(f'https://viacep.com.br/ws/{CEPC}/json/') # 解析响应为JSON字典 cep_data = response.json() print(cep_data) # 数据库操作 con = sqlite3.connect('CEPS.db') cur = con.cursor() cur.execute('DROP TABLE IF EXISTS Requisicao') # 修正cep字段类型为TEXT适配带分隔符的格式 cur.execute("CREATE TABLE Requisicao (cep TEXT, data json)") # 可选:增加无效邮编校验 if 'erro' not in cep_data: # 直接插入单条数据,用?做占位符传递参数 cur.execute("insert into Requisicao values (?, ?)", [cep_data['cep'], json.dumps(cep_data)]) # 用连接对象提交事务 con.commit() print("数据插入成功") else: print("输入的邮编无效,无对应数据") cur.close() con.close()
使用测试邮编09931080、05565000运行代码即可正常完成数据插入。
内容的提问来源于stack exchange,提问作者Rui Barbosa
相关产品推荐
相关产品推荐

