sql >> データベース >  >> RDS >> PostgreSQL

リクエストとpsycopg2を使用してPostgresでJsonを作成/挿入します

    "data"という名前の1つの列を持つテーブルを作成したいようです。 。この列のタイプはJSONです。 (フィールドごとに1つの列を作成することをお勧めしますが、それはあなた次第です。)

    この場合、変数data (リクエストから読み取られる)はlistです dictの s。コメントで述べたように、dataをループすることができます executemany()として一度に1つずつ挿入を行います 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()
    

    ここですべてのpostgres構文が正しいかどうかは100%わかりませんが(テストするPGデータベースにアクセスできません)、このロジックはあなたがやろうとしていることに対して機能するはずです。

    個別の列の更新

    createステートメントを変更して複数の列を処理できますが、各列のデータ型を知っている必要があります。従うことができるいくつかの擬似コードは次のとおりです。

    # 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. 2つ以上のテーブルでLEFTJOINを実行するにはどうすればよいですか?

    2. mysqlの大きなテーブル毎回csvに基づいて行を更新

    3. MySQLの代わりにMySQLiを使用する必要があるのはいつですか?

    4. 句間の変換から結合への変換