PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

अनुरोधों और psycopg2 . के साथ पोस्टग्रेज़ में Json बनाएँ/सम्मिलित करें

ऐसा लगता है कि आप "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% यकीन नहीं है कि सभी पोस्टग्रेज सिंटैक्स यहां सही हैं (मेरे पास परीक्षण करने के लिए पीजी डेटाबेस तक पहुंच नहीं है), लेकिन मेरा मानना ​​​​है कि यह तर्क उस काम के लिए काम करना चाहिए जो आप करने की कोशिश कर रहे हैं।

अलग कॉलम के लिए अपडेट करें

आप कई स्तंभों को संभालने के लिए अपने निर्माण विवरण को संशोधित कर सकते हैं, लेकिन इसके लिए प्रत्येक कॉलम के डेटा प्रकार को जानना होगा। यहां कुछ psuedocode दिए गए हैं जिनका आप अनुसरण कर सकते हैं:

# 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. Postgresql डेटाटाइम में दिनों की संख्या कैसे जोड़ें?

  2. Postgresql संग्रहीत कार्यविधियों के लिए अलगाव स्तर सेट करें

  3. Pyodbc - डेटा स्रोत का नाम नहीं मिला, और कोई डिफ़ॉल्ट ड्राइवर निर्दिष्ट नहीं है

  4. SqlAlchemy(Flask+Postgres) :कैसे एक json फ़ील्ड की केवल एक विशिष्ट विशेषता को अद्यतन करने के लिए?

  5. घातक:निजी कुंजी फ़ाइल /etc/ssl/private/ssl-cert-snakeoil.key तक नहीं पहुंच सका:अनुमति अस्वीकृत