PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Utwórz/wstaw Json w Postgresie z żądaniami i psycopg2

Wygląda na to, że chcesz utworzyć tabelę z jedną kolumną o nazwie "data" . Typ tej kolumny to JSON. (Polecam utworzenie jednej kolumny na pole, ale to zależy od Ciebie).

W tym przypadku zmienna data (to jest odczytywane z żądania) to list z dict s. Jak wspomniałem w moim komentarzu, możesz zapętlić data i wstawiaj pojedynczo jako executemany() nie jest szybszy niż wielokrotne wywołania execute() .

To, co zrobiłem, było następujące:

  1. Utwórz listę pól, na których Ci zależy.
  2. Zapętlaj elementy data
  3. Dla każdego item w data , wyodrębnij pola do my_data
  4. Wywołaj execute() i przekaż json.dumps(my_data) (Konwertuje my_data z dict do ciągu JSON)

Spróbuj tego:

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

Nie jestem w 100% pewien, czy cała składnia postgres jest tutaj poprawna (nie mam dostępu do bazy danych PG do testowania), ale uważam, że ta logika powinna działać w przypadku tego, co próbujesz zrobić.

Aktualizacja dla oddzielnych kolumn

Możesz zmodyfikować swoją instrukcję tworzenia, aby obsługiwała wiele kolumn, ale wymagałoby to znajomości typu danych każdej kolumny. Oto kilka pseudokodów, które możesz śledzić:

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

Zastąp ... z odpowiednimi wartościami dla Twoich danych.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zaimportować wiersze do Postgresql ze standardu STDIN?

  2. Jak duża jest za duża dla tabeli PostgreSQL?

  3. Jak pogrupować znaczniki czasu w wyspy (na podstawie arbitralnej luki)?

  4. Jak to_date() działa w PostgreSQL

  5. Podział dat na podstawie roku obrotowego