PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Създайте/вмъкнете Json в Postgres със заявки и psycopg2

Изглежда, че искате да създадете таблица с една колона с име "data" . Типът на тази колона е JSON. (Бих препоръчал да създадете по една колона на поле, но това зависи от вас.)

В този случай променливата data (което се чете от заявката) е list на dict с. Както споменах в коментара си, можете да преминете през data и правете вмъкванията едно по едно като executemany() не е по-бързо от множество извиквания на execute() .

Това, което направих, беше следното:

  1. Създайте списък с полета, които ви интересуват.
  2. Превъртете елементите на data
  3. За всеки item в data , извлечете полетата в my_data
  4. Извикване на execute() и подайте json.dumps(my_data) (Преобразува my_data от dict в JSON-низ)

Опитайте това:

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

Не съм 100% сигурен дали целият синтаксис на postgres е правилен тук (нямам достъп до PG база данни за тестване), но вярвам, че тази логика трябва да работи за това, което се опитвате да направите.

Актуализация за отделни колони

Можете да промените своя израз за създаване, за да обработвате множество колони, но това ще изисква познаване на типа данни на всяка колона. Ето някои псевдокодове, които можете да следвате:

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

Заменете ... с подходящите стойности за вашите данни.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Част 2:как да получите сумата на заявка, базирана на дял, без всъщност да се завърта

  2. PostgreSQL v13 Разгръщане и мащабиране с ClusterControl 1.8.2

  3. Как да получа локални данни в база данни само за четене с помощта на dplyr?

  4. Промяна на типа на колона, използвана в други изгледи

  5. jsonb срещу jsonb[] за множество адреси за клиент