We have a python script which pulls data form an API endpoint this way:
import urllib, json url = "http://api.exchangeratesapi.io/v1/latest?access_key={test}" response = urllib.urlopen(url) record_list = json.loads(response.read())
We got to this point and we do see the data in record_list, however we don’t know how to parse the data and insert it into a table.
We tried:
if type(record_list) == list: first_record = record_list[0]
but it seems it is not a list, so what it is and how to import it into the DB?
The table has only 2 fields (currency_name and rate)
record_list sample:
{"success":true,"timestamp":1619448844,"base":"EUR","date":"2021-04-26","rates":{"AED":4.438765,"AFN":93.597683,"ALL":123.266852,"AMD":628.973606,"ANG":2.169505,"AOA":793.273462,"ARS":112.71963,"AUD":1.547521,"AWG":2.173782,"AZN":2.056227,"BAM":1.954933,"BBD":2.440381,"BDT":102.484579,"BGN":1.956421,"BHD":0.455567,"BIF":2377.111091,"BMD":1.208496,"BND":1.602106,"BOB":8.333368,"BRL":6.583276,"BSD":1.208646,"BTC":2.2483098e-5,"BTN":90.32643,"BWP":13.045517}}
Thanks!
Advertisement
Answer
Based on assumptions about what you are trying to achieve, an example:
create table currency_rate(currency varchar, rate numeric); import psycopg2 import json con = psycopg2.connect("dbname=test user=aklaver host=localhost") cur = con.cursor() insert_sql = """INSERT INTO currency_rate VALUES(%s, %s)""" record_list = '{"success":true,"timestamp":1619448844,"base":"EUR","date":"2021-04-26","rates":{"AED":4.438765,"AFN":93.597683,"ALL":123.266852,"AMD":628.973606,"ANG":2.169505,"AOA":793.273462,"ARS":112.71963,"AUD":1.547521,"AWG":2.173782,"AZN":2.056227,"BAM":1.954933,"BBD":2.440381,"BDT":102.484579,"BGN":1.956421,"BHD":0.455567,"BIF":2377.111091,"BMD":1.208496,"BND":1.602106,"BOB":8.333368,"BRL":6.583276,"BSD":1.208646,"BTC":2.2483098e-5,"BTN":90.32643,"BWP":13.045517}}' record_dict = json.loads(record_list) for record in record_dict["rates"].items(): cur.execute(insert_sql, [record[0], record[1]]) con.commit() select * from currency_rate ; currency | rate ----------+---------------- AED | 4.438765 AFN | 93.597683 ALL | 123.266852 AMD | 628.973606 ANG | 2.169505 AOA | 793.273462 ARS | 112.71963 AUD | 1.547521 AWG | 2.173782 AZN | 2.056227 BAM | 1.954933 BBD | 2.440381 BDT | 102.484579 BGN | 1.956421 BHD | 0.455567 BIF | 2377.111091 BMD | 1.208496 BND | 1.602106 BOB | 8.333368 BRL | 6.583276 BSD | 1.208646 BTC | 0.000022483098 BTN | 90.32643 BWP | 13.045517
record_list
is a JSON
object as string. Use json.loads
to convert to Python dictionary. Then use psycopg2
to INSERT
records. This is done using a parameterized query(insert_sql
) which is executed in the for
loop using the dictionary items()
from the record_dict['rates
]` dictionary. The transactions are the then committed to have the data persist to the table.