尝试在SQL LITE数据库中插入API数据时出现问题

2024-09-30 18:19:09 发布

您现在位置:Python中文网/ 问答频道 /正文

各位!!所以基本上我有这个问题。我正试图向巴西的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.

zipcodes的示例有:09931080, 05565000

到zipcode示例的输出是:

{
  "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"
}

这是我尝试获取请求时的输出


Tags: the数据代码importapijsonexecuterequests
2条回答

问题中的代码有几个问题:

  • url无效:路径似乎在格式化之前已更改;然而,这可能是一个转录错误,否则会立即导致错误

  • 代码在响应(Requisicao)上循环。这是对原始请求的操作,在这里没有用处。也许,目的是处理返回多个邮政编码的API?因为我们只有示例,所以不需要循环

  • 在查询语句中,values (8, 5)将导致在每一行中插入85。插入您提供的值(这称为参数替换)应该是values (?, ?)

  • 应该提交连接,而不是游标

根据上述注释,插入代码如下所示:

Requisicao1 = Requisicao.json()
cur.execute("insert into Requisicao values (?, ?)",
            [Requisicao1['cep'], json.dumps(Requisicao1)])
con.commit()
cur.close()

您使用的URL似乎与here不匹配,因此我在下面的代码中替换了它

我还删除了循环,因为两个示例zipcode都没有返回多条记录-如果有zipcode返回多条记录,请添加一条

注意,要插入的数据需要是元组,而不是列表

此外,对于多个记录,您将使用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} ")

相关问题 更多 >