sql >> Databasteknik >  >> RDS >> PostgreSQL

Skapa/infoga Json i Postgres med förfrågningar och psycopg2

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:

  1. Skapa en lista över fält som du bryr dig om.
  2. Slinga över elementen i data
  3. För varje item i data , extrahera fälten till my_data
  4. Anrop execute() och skicka in json.dumps(my_data) (Konverterar my_data från ett dict 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.




  1. Skriv ut all data i flersidig paginering

  2. Hur man aktiverar den långsamma frågeloggen i MySQL

  3. Hitta poster med ett datumfält under de senaste 24 timmarna

  4. Jag är förvirrad över samtidiga MySQL-anslutningar