尝试在 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) 将导致85 插入每一行。插入您提供的值应该是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 时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

无法在 SQLite 数据库 Android 上插入数据

关于SQlite插入数据不显示的问题

iOS Swift 插入 sqlite FMDB

SQLite数据库如何批量插入数据?

Android5.0上运行SQLite数据库出现attempt to write a readonly database的解决方案

尝试调用虚拟方法'long android.database.sqlite.SQLiteDatabase.insert [重复]