使用Python调用巴西邮编API取数插入SQLite时参数绑定错误如何解决
问题原因分析
- 方法使用错误:
executemany()适用于批量插入多条数据,需要传入二维序列(比如嵌套列表/元组),你仅插入单条数据,直接使用execute()即可 - 表结构不匹配:你需要插入10个指定字段,原建表语句仅定义了8个字段,还包含你不需要的
validation、created字段,和实际需求完全不符 - 参数数量不匹配:原插入语句写了8个占位符
?,但仅传入了2个参数,绑定数量不一致直接触发报错
修复后完整代码
import requests import sqlite3 CEPC = input("请输入邮编:") print("正在查询邮编信息") Requisicao = requests.get(f"https://viacep.com.br/ws/{CEPC}/json") if Requisicao.status_code == 200: data = Requisicao.json() # 校验无效邮编,API返回无效邮编时会带erro字段 if 'erro' in data: print("输入的邮编无效,请检查后重试") else: # 若要存储到Banco de dados文件夹,需要先手动创建该文件夹,否则直接用当前路径的CEPS.db即可 con = sqlite3.connect("CEPS.db") cur = con.cursor() cur.execute("DROP TABLE IF EXISTS Requisicao") # 建表与需求的10个字段完全匹配 cur.execute(""" CREATE TABLE Requisicao ( cep TEXT, logradouro TEXT, complemento TEXT, bairro TEXT, localidade TEXT, uf TEXT, ibge TEXT, gia TEXT, ddd TEXT, siafi TEXT ) """) # 单条插入用execute,10个占位符对应10个字段值,数量完全匹配 cur.execute( "insert into Requisicao values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", ( data["cep"], data["logradouro"], data["complemento"], data["bairro"], data["localidade"], data["uf"], data["ibge"], data["gia"], data["ddd"], data["siafi"] ) ) con.commit() con.close() print("数据插入成功") else: print(f"请求失败,状态码:{Requisicao.status_code} ")
额外注意事项
- 如果需要保留完整JSON串存储,可以在表中新增
raw_json TEXT字段,插入时把JSON序列化后的值作为第11个参数传入即可 - 若每次查询不需要清空旧表,可以删除
cur.execute("DROP TABLE IF EXISTS Requisicao")语句,避免历史数据丢失
内容的提问来源于stack exchange,提问作者Rui Barbosa
相关产品推荐
相关产品推荐

