Det verkar som att du vill skapa en tabell med en kolumn som heter "data"
. Typen av denna kolumn är JSON. (Jag skulle rekommendera att skapa en kolumn per fält, men det är upp till dig.)
I det här fallet variabeln data
(som läses från begäran) är en list
av dict
s. Som jag nämnde i min kommentar kan du gå över data
och gör infogningen en i taget som executemany()
är inte snabbare än flera anrop till execute()
.
Det jag gjorde var följande:
- Skapa en lista över fält som du bryr dig om.
- Slinga över elementen i
data
- För varje
item
idata
, extrahera fälten tillmy_data
- Anrop
execute()
och skicka injson.dumps(my_data)
(Konverterarmy_data
från ettdict
till en JSON-sträng)
Prova detta:
#!/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()
Jag är inte 100% säker på om all postgres-syntax är korrekt här (jag har inte tillgång till en PG-databas att testa), men jag tror att den här logiken borde fungera för det du försöker göra.
Uppdatera för separata kolumner
Du kan ändra din skapa-sats för att hantera flera kolumner, men det skulle kräva att du känner till datatypen för varje kolumn. Här är lite psuedokod du kan följa:
# 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()
Byt ut ...
med lämpliga värden för dina data.