sql >> Databáze >  >> RDS >> PostgreSQL

Vytvořte/vložte Json v Postgres s požadavky a psycopg2

Zdá se, že chcete vytvořit tabulku s jedním sloupcem s názvem "data" . Typ tohoto sloupce je JSON. (Doporučoval bych vytvořit jeden sloupec na pole, ale je to na vás.)

V tomto případě proměnná data (který je načten z požadavku) je list of dict s. Jak jsem zmínil ve svém komentáři, můžete přecházet přes data a vkládání provádějte jeden po druhém jako executemany() není rychlejší než vícenásobné volání execute() .

Udělal jsem následující:

  1. Vytvořte si seznam polí, která vás zajímají.
  2. Opakujte prvky data
  3. Pro každou item v data , extrahujte pole do my_data
  4. Zavolejte execute() a předejte json.dumps(my_data) (Převede my_data z dict do řetězce JSON)

Zkuste toto:

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

Nejsem si 100% jistý, zda je zde veškerá syntaxe postgresu správná (nemám přístup k databázi PG k testování), ale věřím, že tato logika by měla fungovat pro to, o co se snažíte.

Aktualizace pro samostatné sloupce

Příkaz create můžete upravit tak, aby zpracovával více sloupců, ale vyžadovalo by to znát datový typ každého sloupce. Zde je několik pseudokódů, kterými se můžete řídit:

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

Nahraďte ... s příslušnými hodnotami pro vaše data.




  1. php jak ukládat a číst data json přes mysql?

  2. Jak nevolat Hekaton nativně kompilované uložené procedury

  3. ORDER BY Poddotaz pro převod GROUP BY na JOIN

  4. Obousměrné šifrování DB zabezpečené i od správce