Sepertinya Anda ingin membuat tabel dengan satu kolom bernama "data"
. Jenis kolom ini adalah JSON. (Saya akan merekomendasikan membuat satu kolom per bidang, tetapi terserah Anda.)
Dalam hal ini variabel data
(yang dibaca dari permintaan) adalah list
dari dict
s. Seperti yang saya sebutkan dalam komentar saya, Anda dapat mengulang data
dan lakukan penyisipan satu per satu sebagai executemany()
tidak lebih cepat dari beberapa panggilan ke execute()
.
Yang saya lakukan adalah sebagai berikut:
- Buat daftar bidang yang Anda minati.
- Mengulangi elemen
data
- Untuk setiap
item
dalamdata
, ekstrak bidang kemy_data
- Panggil
execute()
dan masukkanjson.dumps(my_data)
(Mengonversimy_data
daridict
menjadi string-JSON)
Coba ini:
#!/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()
Saya tidak 100% yakin apakah semua sintaks postgres benar di sini (saya tidak memiliki akses ke database PG untuk diuji), tetapi saya percaya bahwa logika ini akan bekerja untuk apa yang Anda coba lakukan.
Perbarui Untuk Kolom Terpisah
Anda dapat memodifikasi pernyataan buat untuk menangani beberapa kolom, tetapi itu akan memerlukan mengetahui tipe data setiap kolom. Berikut beberapa psuedocode yang bisa Anda ikuti:
# 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()
Ganti ...
dengan nilai yang sesuai untuk data Anda.