Det ser ud til, at du vil oprette en tabel med én kolonne med navnet "data"
. Typen af denne kolonne er JSON. (Jeg vil anbefale at oprette én kolonne pr. felt, men det er op til dig.)
I dette tilfælde variablen data
(der læses fra anmodningen) er en list
af dict
s. Som jeg nævnte i min kommentar, kan du gå over data
og gør indsættelserne én ad gangen som executemany()
er ikke hurtigere end flere opkald til execute()
.
Det jeg gjorde var følgende:
- Opret en liste over felter, som du holder af.
- Sløjfe over elementerne i
data
- For hver
item
idata
, udtræk felterne imy_data
- Kald
execute()
og indsendjson.dumps(my_data)
(Konverterermy_data
fra endict
ind i en JSON-streng)
Prøv dette:
#!/usr/bin/env python
import requests
import psycopg2
import json
conn = psycopg2.connect(database='NHL', user='postgres', password='postgres', host='localhost', port='5432')
req = requests.get('http://www.nhl.com/stats/rest/skaters?isAggregate=false&reportType=basic&isGame=false&reportName=skatersummary&sort=[{%22property%22:%22playerName%22,%22direction%22:%22ASC%22},{%22property%22:%22goals%22,%22direction%22:%22DESC%22},{%22property%22:%22assists%22,%22direction%22:%22DESC%22}]&cayenneExp=gameTypeId=2%20and%20seasonId%3E=20172018%20and%20seasonId%3C=20172018')
# data here is a list of dicts
data = req.json()['data']
cur = conn.cursor()
# create a table with one column of type JSON
cur.execute("CREATE TABLE t_skaters (data json);")
fields = [
'seasonId',
'playerName',
'playerFirstName',
'playerLastName',
'playerId',
'playerHeight',
'playerPositionCode',
'playerShootsCatches',
'playerBirthCity',
'playerBirthCountry',
'playerBirthStateProvince',
'playerBirthDate',
'playerDraftYear',
'playerDraftRoundNo',
'playerDraftOverallPickNo'
]
for item in data:
my_data = {field: item[field] for field in fields}
cur.execute("INSERT INTO t_skaters VALUES (%s)", (json.dumps(my_data),))
# commit changes
conn.commit()
# Close the connection
conn.close()
Jeg er ikke 100 % sikker på, om al postgres-syntaksen er korrekt her (jeg har ikke adgang til en PG-database til at teste), men jeg mener, at denne logik burde fungere for det, du forsøger at gøre.
Opdatering til separate kolonner
Du kan ændre din oprettelseserklæring til at håndtere flere kolonner, men det ville kræve at kende datatypen for hver kolonne. Her er noget psuedokode, du kan følge:
# same boilerplate code from above
cur = conn.cursor()
# create a table with one column per field
cur.execute(
"""CREATE TABLE t_skaters (seasonId INTEGER, playerName VARCHAR, ...);"""
)
fields = [
'seasonId',
'playerName',
'playerFirstName',
'playerLastName',
'playerId',
'playerHeight',
'playerPositionCode',
'playerShootsCatches',
'playerBirthCity',
'playerBirthCountry',
'playerBirthStateProvince',
'playerBirthDate',
'playerDraftYear',
'playerDraftRoundNo',
'playerDraftOverallPickNo'
]
for item in data:
my_data = [item[field] for field in fields]
# need a placeholder (%s) for each variable
# refer to postgres docs on INSERT statement on how to specify order
cur.execute("INSERT INTO t_skaters VALUES (%s, %s, ...)", tuple(my_data))
# commit changes
conn.commit()
# Close the connection
conn.close()
Erstat ...
med de passende værdier for dine data.