You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将巴西邮编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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 21:30:04