2016-04-26 7 views
0

Ich habe eine Liste von Tupeln, die ich in meine Datenbank hochladen möchte. Ich möchte dies mit eine Abfrage tun, so dass ich keine Verbindung öffnen muss, während ich über jedes Tupel parse.Importieren von Tupel-Listen in Postgres über Python

Ein Beispiel meiner Tupel-Liste ist wie folgt (diese Liste wird erheblich länger sein): tuple_list = [(u'17 ', u'1', u2 ', u2'), (u '17', u'2 ', u'1', u'4 ')]

Ich möchte eine Abfrage in Postgres schreiben, die diese tuple_list verwenden und die Liste durcharbeiten, um eine Tabelle mit dem Namen' Vorhersagen 'zu füllen. in einem Aufruf an die db.

Ein einziger Aufruf sieht wie folgt aus:

insert into 'Predictions' (userid, fixture_no, home_score, away_score) values (17, 1, 2, 2) 

Ich habe sah mir in die Tupel in eine XML-Datei konvertieren, aber fragte sich, ob es eine bessere Möglichkeit, dies nur in Postgres zu tun, um die Liste von Tupeln mit?

Wenn nicht, wird die XML-Datei, die ich es geschafft haben, sieht wie folgt aus ...

<root> 
    <User_Id/> 
    <Fix_No/> 
    <Home_Score/> 
    <Away_Score/> 
    <User_Id>17</User_Id> 
    <Fix_No>1</Fix_No> 
    <Home_Score>2</Home_Score> 
    <Away_Score>2</Away_Score> 
    <User_Id>17</User_Id> 
    <Fix_No>2</Fix_No> 
    <Home_Score>1</Home_Score> 
    <Away_Score>4</Away_Score> 
</root> 

Mein Hauptziel zu produzieren, ist alles in die Datenbank meine Vorhersagen eher in einem Schuss zu senden als zahlreiche Anrufe denen Lass meine Webanwendung langsamer laufen.

Alle Gedanken oder Ratschläge wären großartig!

Antwort

1

Sie könnten die Syntax für mehrere Ebenen VALUES verwenden, die im Beispielteil der postgresql documentation beschrieben wird. Hier ist ein Python-Snipped, der die insert-Anweisung aus der tuple_list aus Ihrer Frage erstellt.

tuple_list = [(u'17',u'1', u'2', u'2'), (u'17',u'2', u'1', u'4')] 
a = ["("+", ".join(a)+")" for a in tuple_list] 
sql = "insert into 'Predictions' (userid, fixture_no, home_score, away_score) VALUES %s" % (",".join(a)) 
print(sql) 

# Insert into database (code from memory) 
args_str = ','.join(cursor.mogrify("%s", (x,)) for x in tuple_list) 
cursor.execute("INSERT INTO 'Predictions' (userid, fixture_no, home_score, away_score) VALUES "+args_str) 

Ausgang:

insert into 'Predictions' (userid, fixture_no, home_score, away_score) VALUES (17, 1, 2, 2),(17, 2, 1, 4) 
+0

Ich bin neu in Postgres, so dass Kommentar sehr hilfreich ist. Da meine Liste von Tupeln 5 Tupel oder sogar 50 Tupel enthalten kann, wie kann ich eine Abfrage schreiben, die sich an die Anzahl der Tupel anpasst, die ich an sie weitergebe? – LemusThelroy

+0

Dies ist eine fantastische Antwort. Vielen Dank. Wenn diese Abfrage in meinem Python-Code enthalten ist, denken Sie, dass die SQL-Injection sicher wäre? Da die tuple_list von Benutzereingaben aus der Webanwendung stammt. – LemusThelroy

+0

@LemusThelroy Sie sollten sicherstellen, dass alle eingefügten Daten korrekt maskiert sind. Der beste Weg besteht darin, gespeicherte Prozeduren zu erstellen. Dieses Beispiel ist NICHT sicher! – salomonderossi