PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Buat/Sisipkan Json di Postgres dengan permintaan dan psycopg2

Sepertinya Anda ingin membuat tabel dengan satu kolom bernama "data" . Jenis kolom ini adalah JSON. (Saya akan merekomendasikan membuat satu kolom per bidang, tetapi terserah Anda.)

Dalam hal ini variabel data (yang dibaca dari permintaan) adalah list dari dict s. Seperti yang saya sebutkan dalam komentar saya, Anda dapat mengulang data dan lakukan penyisipan satu per satu sebagai executemany() tidak lebih cepat dari beberapa panggilan ke execute() .

Yang saya lakukan adalah sebagai berikut:

  1. Buat daftar bidang yang Anda minati.
  2. Mengulangi elemen data
  3. Untuk setiap item dalam data , ekstrak bidang ke my_data
  4. Panggil execute() dan masukkan json.dumps(my_data) (Mengonversi my_data dari dict menjadi string-JSON)

Coba ini:

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

Saya tidak 100% yakin apakah semua sintaks postgres benar di sini (saya tidak memiliki akses ke database PG untuk diuji), tetapi saya percaya bahwa logika ini akan bekerja untuk apa yang Anda coba lakukan.

Perbarui Untuk Kolom Terpisah

Anda dapat memodifikasi pernyataan buat untuk menangani beberapa kolom, tetapi itu akan memerlukan mengetahui tipe data setiap kolom. Berikut beberapa psuedocode yang bisa Anda ikuti:

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

Ganti ... dengan nilai yang sesuai untuk data Anda.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara Membuat Daftar Database dan Tabel di PostgreSQL

  2. PostgreSQL memeriksa elemen catatan sebelumnya

  3. SET dan SELECT dalam satu kueri?

  4. PostgreSQL 13:Jangan biarkan slot membunuh yang utama

  5. Timestampable tidak berfungsi dengan database ORM dan PostgreSQL