sql >> Database >  >> RDS >> PostgreSQL

Maak / voeg Json in Postgres in met verzoeken en psycopg2

Het lijkt erop dat u een tabel wilt maken met één kolom met de naam "data" . Het type van deze kolom is JSON. (Ik zou aanraden om één kolom per veld te maken, maar dat is aan jou.)

In dit geval de variabele data (die uit het verzoek wordt gelezen) is een list van dict s. Zoals ik in mijn opmerking al zei, kun je data doorlussen en doe de invoegingen één voor één als executemany() is niet sneller dan meerdere aanroepen van execute() .

Wat ik deed was het volgende:

  1. Maak een lijst met velden die u belangrijk vindt.
  2. Loop over de elementen van data
  3. Voor elk item in data , extraheer de velden in my_data
  4. Bel execute() en geef json.dumps(my_data) . door (Converteert my_data van een dict in een JSON-string)

Probeer dit:

#!/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()

Ik weet niet 100% zeker of alle postgres-syntaxis hier correct is (ik heb geen toegang tot een PG-database om te testen), maar ik geloof dat deze logica zou moeten werken voor wat u probeert te doen.

Update voor afzonderlijke kolommen

U kunt uw create-instructie wijzigen om meerdere kolommen te verwerken, maar hiervoor moet u het gegevenstype van elke kolom weten. Hier is wat pseudocode die je kunt volgen:

# 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()

Vervang de ... met de juiste waarden voor uw gegevens.




  1. Bereken de som van twee kolommen in volgorde van clausule - laravel

  2. Opgeslagen procedurefoutargument 1 voor routine ... is geen variabele of NIEUWE pseudo-variabele in BEFORE trigger

  3. SQLAlchemy Core - PostgreSQL SUBSTRING-expressie genereren?

  4. MYSQL - SELECTEER gegevens uit dynamische tabelnamen