Zdá se, že chcete vytvořit tabulku s jedním sloupcem s názvem "data"
. Typ tohoto sloupce je JSON. (Doporučoval bych vytvořit jeden sloupec na pole, ale je to na vás.)
V tomto případě proměnná data
(který je načten z požadavku) je list
of dict
s. Jak jsem zmínil ve svém komentáři, můžete přecházet přes data
a vkládání provádějte jeden po druhém jako executemany()
není rychlejší než vícenásobné volání execute()
.
Udělal jsem následující:
- Vytvořte si seznam polí, která vás zajímají.
- Opakujte prvky
data
- Pro každou
item
vdata
, extrahujte pole domy_data
- Zavolejte
execute()
a předejtejson.dumps(my_data)
(Převedemy_data
zdict
do řetězce JSON)
Zkuste toto:
#!/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()
Nejsem si 100% jistý, zda je zde veškerá syntaxe postgresu správná (nemám přístup k databázi PG k testování), ale věřím, že tato logika by měla fungovat pro to, o co se snažíte.
Aktualizace pro samostatné sloupce
Příkaz create můžete upravit tak, aby zpracovával více sloupců, ale vyžadovalo by to znát datový typ každého sloupce. Zde je několik pseudokódů, kterými se můžete řídit:
# 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()
Nahraďte ...
s příslušnými hodnotami pro vaše data.