【问题标题】:Parsing JSON from API to PostgreSQL Database using Python使用 Python 将 JSON 从 API 解析到 PostgreSQL 数据库
【发布时间】:2020-05-19 19:22:21
【问题描述】:

我对数据库和 API 还很陌生,但我想从 API 中检索 JSON 数据并使用 Python 将其存储在 PostgreSQL 数据库中。最终,我想将信息存储在数据库中,以便 TensorFlow 脚本使用。

我在这里查看了以前的问题,但似乎找不到有效的解决方案。如果有人可以提供任何进一步的信息或为我指明正确的方向,那就太好了。

到目前为止我有:

  • 在我的 PostgreSQL 数据库中创建了一个表
  • 检查与数据库的连接是否正常
  • 检查正在读取的 JSON 数据
  • 写了如下代码
import json, urllib.request, requests
import psycopg2
from psycopg2.extras import execute_values


# Retrieve Json Data from Within API

url = "https://api.exchangeratesapi.io/latest?symbols=USD,GBP"
response = urllib.request.urlopen(url)
data = json.loads(response.read())

print(data)

# ***** connect to the db *******
try:
    conn = psycopg2.connect(database='postgres', user='postgres', password='********', host='localhost', port='5432')
except:
    print("I am unable to connect to the database")

# cursor
cur = conn.cursor()

fields = [
    'USD', 
    'GBP', 
    'base', 

]

for apidata in data:
    my_data = [apidata[field] for field in fields]
    insert_query = "INSERT INTO apidata VALUES (?, ?, ?)" #%d for int %s for string
    cur.execute(insert_query, tuple(my_data))
    conn.commit()

# close the cursor
cur.close()

# close the connection
conn.close()

【问题讨论】:

  • 1.错误信息是什么? 2. api返回的json的典型格式是什么 3. 我认为你不需要将你的行设为元组,你可以在execute中显式地将每一行数据作为一个列表传递
  • 嗨@Willyzekid,感谢您的回复。 1. 返回的错误信息是:C:\>python apisandbox.py {'rates': {'USD': 1.095, 'GBP': 0.89535}, 'base': 'EUR', 'date': '2020- 05-19'} 回溯(最后一次调用):文件“apisandbox.py”,第 81 行,在 my_data = [apidata[field] for field in fields] 文件“apisandbox.py”,第 81 行,在 my_data = [apidata[field] for field in fields] TypeError: string indices must be integers 2. 请看上面的JSON文件格式

标签: python json postgresql tensorflow


【解决方案1】:

apidata(或data)不是您所期望的 - 它实际上是一个包含字典键的字符串。因此错误......所以你可能想要做的只是

...
fields = [
    'USD', 
    'GBP', 
    'base', 
]
my_data = [data[field] for field in fields]
insert_query = "INSERT INTO apidata VALUES (?, ?, ?)"
cur.execute(insert_query, tuple(my_data))
conn.commit()
...

但这也行不通,因为您从 api 获得的字典格式为 {'rates': {'USD': 1.095, 'GBP': 0.89535}, 'base': 'EUR', 'date': '2020-05-19'} 其中 'USD' 和 'GBP' 嵌套在 'rates' 中,因此您无法在简单的列表理解中访问它。下面是一个快速而肮脏的正确方法

...
fields = [
    'USD', 
    'GBP', 
]
my_data = [data['rates'][field] for field in fields]
my_data.append(data['base'])
insert_query = "INSERT INTO apidata VALUES (?, ?, ?)"
cur.execute(insert_query, my_data)
conn.commit()
...

【讨论】:

    猜你喜欢
    • 2018-01-28
    • 1970-01-01
    • 2019-04-14
    • 1970-01-01
    • 2020-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    相关资源
    最近更新 更多