如何使用Python将嵌套字典/json插入MySQL表

如何使用Python将嵌套字典/json插入MySQL表,python,mysql,json,python-requests,pymysql,Python,Mysql,Json,Python Requests,Pymysql,我已连接到api,如下所示: import requests, json, pymysql from db_credentials import db_config get_url = "https://api.exchangeratesapi.io/history?start_at=2018-01-01&end_at=2018-02-02&base=GBP" response = requests.get(get_url) results = response.content

我已连接到api,如下所示:

import requests, json, pymysql
from db_credentials import db_config

get_url = "https://api.exchangeratesapi.io/history?start_at=2018-01-01&end_at=2018-02-02&base=GBP"
response = requests.get(get_url)
results = response.content
data = json.loads(results.decode('utf-8'))['rates']

print(data.keys())
print(data)
data.keys()
data
如下所示:

dict_keys(['2018-01-22', '2018-01-09', '2018-01-24', '2018-01-03', '2018-01-23', '2018-01-25', '2018-01-18', '2018-02-02', '2018-01-15', '2018-01-02', '2018-01-16', '2018-01-11', '2018-01-17', '2018-01-12', '2018-01-30', '2018-02-01', '2018-01-29', '2018-01-08', '2018-01-10', '2018-01-05', '2018-01-04', '2018-01-26', '2018-01-31', '2018-01-19'])

{'2018-01-02': {'AUD': 1.7327127809,
                'BGN': 2.1986891954,
                'BRL': 4.440996931,
                'CAD': 1.7006733893,
                ...},
 '2018-01-03': {'AUD': 1.730482852,
                'BGN': 2.2064530686,
                'BRL': 4.4264440433,
                ...},
 ...}
我有一个空的MySQL表,其中包含日期、货币和汇率列,我希望使用以下代码行填充这些列:

connection = pymysql.connect(**db_config, cursorclass=pymysql.cursors.DictCursor)
with connection.cursor() as cursor:
    insert_statement = "INSERT INTO gbpExchangeRates VALUES (%s)" % data
    cursor.execute(insert_statement)
connection.commit()
connection.close()
显然,它不起作用,需要事先进行一些操作。。。
我尝试了
data=json.dumps(data)
,但不确定下一步该做什么…

好吧,你不能简单地将json扔到数据库,然后期望它能像那样工作。您必须将其展平到准备插入的行

看看我使用
SQLite
编写的示例。它使用相同的驱动程序,因此它应该与您的MySQL驱动程序相当兼容

导入请求
导入json
导入sqlite3
获取url=”https://api.exchangeratesapi.io/history?start_at=2018-01-01&end_at=2018-02-02&base=GBP“
response=requests.get(获取url)
结果=response.content
data=json.load(results.decode('utf-8'))['rates']
如果数据:
conn=sqlite3.connect('rates.db')
c=连接光标()
#在这里,我只是创建了一个示例表,其中包含上面指定的所有字段
c、 执行(“”)
创建汇率表(
“id”整数主键,
“日期”日期,
“货币”文本,
“费率”数字
)
""")
c、 执行官(
“插入汇率(“日期”、“货币”、“汇率”)值(?,,?)”,
#这是迭代数据并为SQL展平数据的地方
((日期、货币、值)表示货币,值表示汇率。项()表示日期,率表示数据。项()
)
康涅狄格州提交
康涅狄格州关闭

建立在techouse answer的基础上

  • 在insert语句中删除了列名周围的引号,即日期、货币、汇率
  • 将货币的
    ((日期、货币、值)、汇率中的值。日期的项目()和数据中的汇率。项目())替换为
    插入数据

  • 获取每个日期和货币的重复汇率
    insert_data = []
    for date, rates in data.items():
        for currency, value in rates.items():
            list_data = []
            list_data.append(date)
            list_data.append(currency)
            list_data.append(value)
            insert_data.append(list_data)
    
    insert_data