2017-06-25 3 views
0

Ich bin ein Neuling und habe eine Straßensperre versucht, verwandte Werte in zwei Tabellen gleichzeitig einzufügen. Ich würde Ihre Führung schätzen, um das zu lösen!Einfügen von verwandten Daten in zwei Tabellen mit in psql

Tabelle 1 (Spieler):

CREATE TABLE players(
    player_id serial PRIMARY KEY, 
    player_name varchar(50) NOT NULL); 

Tabelle 2 (Ergebnisse):

CREATE TABLE matches(
    player_id integer CONSTRAINT fk_links_match_player 
    REFERENCES players(player_id) NOT NULL, 
    match int NOT NULL, 
    match_result varchar(4) NOT NULL 
); 

Meine Funktion: Ich möchte, dass die Funktionswerte auf die Abfrage zu übergeben. Ich habe mehrere Variationen einschließlich der folgenden, aber bisher kein Glück versucht.

def registerPlayer(name): 
    cur.execute("""WITH player_key AS 
       (INSERT INTO players(player_name) VALUES(%(name)s), {'name': name} RETURNING player_id) 
       INSERT INTO matches (player_id, match, match_result) 
       VALUES((SELECT player_key.player_id), 1, 'won') """) 

Antwort

1

Sie in einer einzigen Abfrage:

query = """ 
    with player_key as (
     insert into players(player_name) 
     values (%(name)s) 
     returning player_id 
    ) 
    insert into matches (player_id, match, match_result) 
    select player_id, 1, 'won' 
    from player_key 
""" 

cursor.execute (query, {'name': name}) 
+0

@Clodaldo Neto vielen Dank !! Ich wollte das so lernen! – rstreet

2

ich auf diese Weise tun würde: es

connection.begin() # start a transaction 
cur.execute("INSERT INTO players (player_name) VALUES (%(name)s) RETURNING player_id", {'name': name}) 
player_id = cur.fetchone()[0] 
cur.execute("INSERT INTO matches (player_id, match, match_result) VALUES (%(player_id)s, 1, 'won')", {'player_id': player_id}) 
connection.commit() 
+0

Sie danken so viel, es funktionierte! Kann ich noch zwei weitere Fragen zu Ihrer Frage stellen? 1- registriert "fetchone()" immer noch die richtige ID in der Tabelle "Matches", wenn zwei Transaktionen gleichzeitig stattfinden? 2- Was ist die Notwendigkeit für "[0]" in der "fetchone()" Methode? es scheint ohne zu funktionieren? Nochmals vielen Dank für Ihre Hilfe! – rstreet

+0

'fetchone()' ruft ab, was 'RETURNING player_id' von der Abfrage zurückgibt. Er ruft eine Zeile als eine Liste von Spalten ab; Nun, in unserem Fall gibt es genau eine Spalte, also benutze ich den Index '[0]'. – phd

+0

https://stackoverflow.com/help/someone-answers – phd

Verwandte Themen