2017-11-03 3 views
0

Ich versuche, ein Wörterbuch in eine Postgres-Datenbank über SQLAlchemy in Python zu laden. Das Wörterbuch, wie es Strom vorhanden ist:Einfügen eines Wörterbuchs in Postgres über SQLAlchemy

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'}} 

Ich habe den folgenden Code geschrieben (basierend aus anderen Tutorials/Fragen, die ich habe hier und online gefunden). Ich könnte das schaffen, wenn ich nur 1 Datensätze einfügen würde - da ich das Attribut manuell PlayerStats zuweisen könnte. Aber mit dem Wörterbuch, das mehrere Datensätze hat, weiß ich nicht, wie ich sie alle auf die Sitzungsanweisungen übergebe.

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 # 

Ich bin sicher, dass ich etwas einfach fehlt bin, aber wie gehe ich alle Inhalte des Finaldata-Wörterbuch auf die SQLAlchemy Anweisung hinzufügen?

Antwort

1

Ihre FinalData-Struktur besteht aus 3 inneren Dicts, die jeweils durch eine Integer-Sequenz kodiert sind. Sie müssen sie also entpacken, indem Sie für jeden Schlüssel in den Subdicts ein neues PlayerStats-Objekt erstellen.

Im Beispiel unten verwende ich die Ganzzahltasten des inneren Diktats FinalData['GAME_ID'], um nach Werten in den anderen zwei Dicts zu suchen, um die restlichen Felder zu füllen.

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

Großartig. Vielen Dank!! Ist es in Bezug auf Best Practices sinnvoller, die inneren Wörterbücher zu entpacken und in ein großes Wörterbuch zu übersetzen? Wenn ja, gibt es einen korrekten Prozess dazu? –

+0

@GeorgeRodman Nein, ich denke nicht, dass Sie das Wörterbuch vor der Verarbeitung transformieren müssen, es sei denn, Sie sind derjenige, der das Wörterbuch generiert und es anders erzeugen könnte. Ansonsten akzeptiere es so, wie es ist, und wandle es direkt in Datenbankobjekte um, wie oben gezeigt. Zwischenstruktur würde nur zur Verwirrung beitragen. – nosklo