2017-11-03 13 views
0

私はPythonでSQLAlchemy経由でPostgresデータベースに辞書をロードしようとしています。それが現在存在する辞書です:SQLAlchemy経由でPostgresに辞書を挿入

FinalData = {'GAME_ID': {0: '0021600457', 1: '0021600457', 2: '0021600457', 3: 
'0021600457', 4: '0021600457', 5: '0021600457'}, 'TEAM_ID': {0: 1610612744, 1: 
1610612744, 2: 1610612744, 3: 1610612744, 4: 1610612744, 5: 1610612744}, 
'TEAM_ABBREVIATION': {0: 'GSW', 1: 'GSW', 2: 'GSW', 3: 'GSW', 4: 'GSW', 5: 
'GSW'}} 

私が書かれた次のコード(私はここでは、オンライン見つけたオフに基づいて他のチュートリアル/質問を)持っています。 1つのレコードしか挿入していない場合、PlayerStatsに属性を手動で割り当てることができたので、この作業を行うことができました。しかし、複数のレコードを持つディクショナリでは、セッション文に一括して渡す方法がわかりません。

from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy import Column, Integer, String 

Base = declarative_base() 

class PlayerStats(Base): 
    __tablename__ = 'PlayerStats' 

    GAME_ID = Column(String(10), primary_key=True) 
    TEAM_ID = Column(String(10)) 
    TEAM_ABBREVIATION = Column(String(8)) 

################################################### 
## I DON'T KNOW WHAT GOES HERE TO BRIDGE THE GAP ## 
################################################### 

engine = create_engine('postgres://.........') 
Base.metadata.create_all(engine) 
Session = sessionmaker(bind=engine) 
session = Session() 
session.add(FinalData) # I'M ASSUMING I NEED TO ITERATE OVER THIS # 

私は、単純な何かが欠けてると確信しているが、どのように私はステートメントを追加SQLAlchemyの上にFinalData辞書のすべての内容を渡すのですか?

答えて

1

あなたのFinalData構造は3つの内部ディクテーションから成り立っています。それぞれ、いくつかの整数シーケンスでキーイングされているため、サブディスクリプタの各キーに新しいPlayerStatsオブジェクトを作成することでアンパックする必要があります。

以下の例では、他の2つのディクテーションの値を検索して残りのフィールドを埋めるために、FinalData['GAME_ID']内部ディクテーションの整数キーを使用しています。

from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy import Column, Integer, String 

Base = declarative_base() 

class PlayerStats(Base): 
    __tablename__ = 'PlayerStats' 

    GAME_ID = Column(String(10), primary_key=True) 
    TEAM_ID = Column(String(10)) 
    TEAM_ABBREVIATION = Column(String(8)) 

################################################### 
FinalData = {'GAME_ID': {0: '0021600457', 1: '0021600457', 2: '0021600457', 3: 
'0021600457', 4: '0021600457', 5: '0021600457'}, 'TEAM_ID': {0: 1610612744, 1: 
1610612744, 2: 1610612744, 3: 1610612744, 4: 1610612744, 5: 1610612744}, 
'TEAM_ABBREVIATION': {0: 'GSW', 1: 'GSW', 2: 'GSW', 3: 'GSW', 4: 'GSW', 5: 
'GSW'}} 
################################################### 

engine = create_engine('postgres://.........') 
Base.metadata.create_all(engine) 
Session = sessionmaker(bind=engine) 
session = Session() 

for key in FinalData['GAME_ID']: 
    p = PlayerStats() 
    p.GAME_ID = FinalData['GAME_ID'][key] 
    p.TEAM_ID = FinalData['TEAM_ID'].get(key) 
    p.TEAM_ABBREVIATION = FinalData['TEAM_ABBREVIATION'].get(key) 
    session.add(p) 

session.commit() 
+0

グレート。ありがとうございました!!ベストプラクティスの面では、内部の辞書を解凍して1つの大きな辞書に変換する方が理にかなっていますか?もしそうなら、これを行う正しいプロセスがありますか? –

+0

@GeorgeRodmanいいえ、あなたが辞書を生成していて、それを別の方法で生成できるのでなければ、辞書を処理する前に変換する必要はないと思います。さもなければそれをそのまま受け入れ、上記のようにデータベースオブジェクトに直接変換してください。中間構造は混乱を招くだけです。 – nosklo

関連する問題