尝试在 SQLITE DATABASE 中插入 API DATA 时出现问题
Posted
技术标签:
【中文标题】尝试在 SQLITE DATABASE 中插入 API DATA 时出现问题【英文标题】:Problems while trying to insert API DATA in SQL LITE DATABASE 【发布时间】:2021-10-17 12:35:55 【问题描述】:大家!所以基本上我有这个问题。我正在尝试向巴西的zipcode API
发出请求,但数据以JSON
格式显示。我要做的,就是从API
获取这些信息,并将其放在SQLlite database
上。但是,不知何故,我不知道该怎么做。我尝试使用此代码:
import requests
import sqlite3
import json
print('Identifying the ZIP CODE')
CEPC = input('Please type the zipcode:')
Requisicao = requests.get('https://viacep.com.br/ws/%7B%7D/json/%27.format(CEPC))
print(Requisicao.json())
#Database
con = sqlite3.connect('CEPS.db')
cur = con.cursor()
cur.execute('DROP TABLE IF EXISTS Requisicao')
cur.execute("CREATE TABLE Requisicao (cep int(8), data json)")
for Requisicao1 in Requisicao:
cur.execute("insert into Requisicao values (8, 5)",
[Requisicao1['cep'], json.dumps(Requisicao1)])
cur.commit()
cur.close()
当我尝试向 API 发出请求时,一切正常,但是当我尝试在数据库中插入数据时,我无法做到。说到这段代码部分:
for or Requisicao1 in Requisicao:
cur.execute("insert into Requisicao values (8, 5)",
[Requisicao1['cep'], json.dumps(Requisicao1)])
It gives me the error: TypeError: byte indices must be integers or slices, not str.
邮政编码示例为:09931080, 05565000
。
邮政编码示例的输出是:
"cep": "05565-000",
"logradouro": "Avenida General Asdrúbal da Cunha",
"complemento": "",
"bairro": "Jardim Arpoador",
"localidade": "São Paulo",
"uf": "SP",
"ibge": "3550308",
"gia": "1004",
"ddd": "11",
"siafi": "7107"
这是我尝试获取请求时的输出。
【问题讨论】:
您能否在问题中添加一些示例邮政编码,尤其是那些会返回多个结果的邮政编码? 【参考方案1】:您使用的 URL 似乎与 here 不匹配,因此我已将其替换为以下代码。
我还删除了循环,因为示例邮政编码都没有返回多条记录 - 如果有邮政编码,请添加一条。
注意要插入的数据必须是元组,而不是列表。
此外,对于多条记录,您可以使用 executemany
和一个元组列表。
import requests
import sqlite3
import json
CEPC = input("Please type the zipcode:")
print("Identifying the ZIP CODE")
Requisicao = requests.get(f"https://viacep.com.br/ws/CEPC/json")
if Requisicao.status_code == 200:
data = Requisicao.json()
# Database
con = sqlite3.connect("CEPS.db")
cur = con.cursor()
cur.execute("DROP TABLE IF EXISTS Requisicao")
cur.execute("CREATE TABLE Requisicao (cep int(8), data json)")
cur.execute("insert into Requisicao values (?, ?)", (data["cep"], json.dumps(data)))
con.commit()
con.close()
else:
print(f"Request failed with status code Requisicao.status_code ")
【讨论】:
您的代码也可以正常工作,能否请我再帮帮我一次?请检查我的编辑 代码它没有向多列插入值,我不得不更改代码【参考方案2】:问题中的代码有几个问题:
url无效:路径似乎在格式化之前就已经存在;不过这大概是抄写错误,否则会立即导致错误
代码循环响应 (Requisicao
)。这是在原始请求上运行的,在这里没有用。也许,目的是处理返回多个邮政编码的 API?由于我们只有示例,因此无需循环。
在查询语句中,values (8, 5)
将导致8
和5
插入每一行。插入您提供的值应该是values (?, ?)
(这称为参数替换)。
应该提交连接,而不是光标。
基于上述 cmets,插入代码如下所示:
Requisicao1 = Requisicao.json()
cur.execute("insert into Requisicao values (?, ?)",
[Requisicao1['cep'], json.dumps(Requisicao1)])
con.commit()
cur.close()
【讨论】:
您能检查一下我的新编辑吗?代码正在运行,但我需要插入更多列 @Rui3144 不 - 一旦问题得到解答,您将无法更改。问一个新问题。并回滚您对问题的编辑。 哦,对不起,我不知道以上是关于尝试在 SQLITE DATABASE 中插入 API DATA 时出现问题的主要内容,如果未能解决你的问题,请参考以下文章
Android5.0上运行SQLite数据库出现attempt to write a readonly database的解决方案
尝试调用虚拟方法'long android.database.sqlite.SQLiteDatabase.insert [重复]