"data"
という名前の1つの列を持つテーブルを作成したいようです。 。この列のタイプはJSONです。 (フィールドごとに1つの列を作成することをお勧めしますが、それはあなた次第です。)
この場合、変数data
(リクエストから読み取られる)はlist
です dict
の s。コメントで述べたように、data
をループすることができます executemany()
として一度に1つずつ挿入を行います execute()
を複数回呼び出すよりも速くはありません 。
私がしたことは次のとおりです:
- 気になるフィールドのリストを作成します。
-
data
の要素をループします - 各
item
data
内 、フィールドをmy_data
に抽出します -
execute()
を呼び出しますjson.dumps(my_data)
を渡します (my_data
を変換しますdict
から JSON文字列に)
これを試してください:
#!/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()
ここですべてのpostgres構文が正しいかどうかは100%わかりませんが(テストするPGデータベースにアクセスできません)、このロジックはあなたがやろうとしていることに対して機能するはずです。
個別の列の更新
createステートメントを変更して複数の列を処理できますが、各列のデータ型を知っている必要があります。従うことができるいくつかの擬似コードは次のとおりです。
# 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()
...
を置き換えます データに適切な値を使用します。