sql >> Database teknologi >  >> RDS >> PostgreSQL

Opret/indsæt Json i Postgres med anmodninger og psycopg2

Det ser ud til, at du vil oprette en tabel med én kolonne med navnet "data" . Typen af ​​denne kolonne er JSON. (Jeg vil anbefale at oprette én kolonne pr. felt, men det er op til dig.)

I dette tilfælde variablen data (der læses fra anmodningen) er en list af dict s. Som jeg nævnte i min kommentar, kan du gå over data og gør indsættelserne én ad gangen som executemany() er ikke hurtigere end flere opkald til execute() .

Det jeg gjorde var følgende:

  1. Opret en liste over felter, som du holder af.
  2. Sløjfe over elementerne i data
  3. For hver item i data , udtræk felterne i my_data
  4. Kald execute() og indsend json.dumps(my_data) (Konverterer my_data fra en dict ind i en JSON-streng)

Prøv dette:

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

Jeg er ikke 100 % sikker på, om al postgres-syntaksen er korrekt her (jeg har ikke adgang til en PG-database til at teste), men jeg mener, at denne logik burde fungere for det, du forsøger at gøre.

Opdatering til separate kolonner

Du kan ændre din oprettelseserklæring til at håndtere flere kolonner, men det ville kræve at kende datatypen for hver kolonne. Her er noget psuedokode, du kan følge:

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

Erstat ... med de passende værdier for dine data.




  1. Oracle SQL :Procedure, der kan oprette midlertidige tabeller inde i den

  2. vælg mulighed for at opdatere anden valgmulighed baseret på mysql-befolkede rullemenuer

  3. Opgradering af MariaDB 10.0 til 10.3.9 på Ubuntu 16.04

  4. JDBC-driver til Oracle 10G XE