【问题标题】:Trying to get json data to be parsed into an SQL server试图将 json 数据解析为 SQL 服务器
【发布时间】:2022-01-15 03:08:08
【问题描述】:

通过使用 python,我一直在尝试从在线 API 获取数据并将其解析到 MySQL 服务器中。但是,我不断遇到不同的错误。其中一个错误是

Exception has occurred: AttributeError 'str' object has no attribute 'get' File "C:\Users\bazoo\ShortPy\ShortPy.py", line 19, in <module> title=comic.get("title")"  

感谢任何帮助。

代码:

from sqlite3.dbapi2 import Connection, Cursor 
import requests
import sqlite3
import json
import pandas as pd
import pyodbc
import MySQLdb
import mysql.connector
import pymysql
from requests.models import Response

response_API= requests.get('https://api.shortboxed.com/comics/v1/new')
data=response_API.json()
comics_in_box=json.dumps(data)
conn = pymysql.connect(host ="", user ="", password = "", db ="")
cursor=conn.cursor()

for comic in comics_in_box:
    title=comic.get("title")
    publisher=comic.get("publisher")
    price=comic.get("price")
    diamond_id=comic.get("diamond_id")
    cursor.execute("insert into Shortbox (title, publisher, price, diamond_id) value (%s, %s, %s, %s)", (title, publisher, price, diamond_id))
conn.commit()
conn.close()

【问题讨论】:

  • 您遇到的错误是什么?
  • 发生异常:AttributeError 'str' object has no attribute 'get' File "C:\Users\bazoo\ShortPy\ShortPy.py",第 19 行,在 title=comic 中。获取(“标题”)
  • 是的,json.dumps 从一个对象中生成一个字符串,所以你可能只需要不做comics_in_box=json.dumps(data) 而是说comics_in_box = data
  • 错误仍然存​​在

标签: python mysql json


【解决方案1】:

在您的代码中,comics_in_box 是 JSON 字符串,而不是 dict 对象,因为您已经在转储它。你不能指望解析像dict这样的字符串

我做了一些更改以更正您的代码。

response_API= requests.get('https://api.shortboxed.com/comics/v1/new')
# Use the JSON object as is
comics_in_box=response_API.json()
conn = pymysql.connect(host ="", user ="", password = "", db ="")
cursor=conn.cursor()

#The respons contains comics as the key to the array
for comic in comics_in_box.get("comics"):
    title=comic.get("title")
    publisher=comic.get("publisher")
    price=comic.get("price")
    diamond_id=comic.get("diamond_id")
    cursor.execute("insert into Shortbox (title, publisher, price, diamond_id) value (%s, %s, %s, %s)", (title, publisher, price, diamond_id))
conn.commit()
conn.close()

【讨论】:

    【解决方案2】:

    您可以将 json 直接加载到 pandas 数据帧,然后通过 to_sql 方法将其写入服务器。

    数据框看起来像

    使用如下代码通过sqlalchemy将该df加载到db

    import requests
    import json
    from pandas.io.json import json_normalize
    from sqlalchemy import create_engine
    
    response_API= requests.get('https://api.shortboxed.com/comics/v1/new')
    data = json.loads(response_API.content)
    df = json_normalize(data, record_path=['comics'])
    engine = create_engine("mysql://user:password@localhost:port/db")
    df.to_sql(name='Shortbox', schema='dbo', con=engine, if_exists='append', index=False)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-02
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 2019-06-01
      • 2023-03-22
      • 1970-01-01
      • 2017-01-19
      相关资源
      最近更新 更多