2017-04-24 6 views
1

Dies ist vielleicht eine sehr einfache Frage, während es mich lange gedauert hat und es immer noch nicht geschafft, es herauszufinden. Ich brauche zwei Tabellen in Postgresql und dynamisch in meiner Nodejs App aktualisiert werden. Die Tabelle1 hat zwei Spalten (obj_id, obj_name), Tabelle2 hat mehr Spalten, während eine Spalte als "obj_id" enthalten ist, während sich "fk" auf "obj_id" in Tabelle1 bezieht; Ich habe versucht, einen Datensatz in Tabelle1 einzufügen und dann eine Verarbeitung durchzuführen und den entsprechenden Datensatz in Tabelle2 einzufügen. Ich brauche den Wert "obj_id", der von der ersten Einfügung zurückgegeben wurde, und verwende ihn zusammen mit anderen Werten, um die zweite Einfügung durchzuführen. Ich versuche, dies mit dem folgenden Code zu tun, während es immer Fehlermeldung (einfügen oder aktualisieren auf Tabelle "Tabelle2" verletzt Fremdschlüssel Einschränkung "rel_table2_table1").Wie Datensätze in zwei Tabellen in Nodejs dynamisch miteinander verbunden werden

function uploadTable1(name,callback){ 
    const client = new pg.Client(conString); 
    client.connect(); 
    client.on("drain", function() { 
    client.end(); 
    }); 

let insertTable1 = client.query(`INSERT INTO table1 (obj_name) VALUES ($1) RETURNING obj_id`, [name]); 
insertTable1.on("row", function (row,result) { 
    callback(row.obj_id); 
}); 

}

function uploadTable2(kk,ff) { 
return function (obj_id) { 
    const client = new pg.Client(conString); 
    client.connect(); 
    client.on("drain", function() { 
     client.end(); 
    }); 

    let uploadQuery = client.query("INSERT INTO table2 (kk,ff,obj_id) VALUES ($1,$2, $3)",[kk,ff, obj_id]); 
    } 
} 

ich diese beiden Funktionen ausführen können mannually nacheinander Aufzeichnungen problemlos eingefügt werden, während, wenn sie zusammen im Hauptprogramm laufen, wie unten gezeigten Code, habe ich Fehler, die oben erwähnt .

uploadTable1("obj_name1",uploadTable2("kk1","ff1")); 

Ich überprüfte die tabelle1 erfolgreich eingeführt wurde und der neue Datensatz „OBJ_ID“ Wert hat an die Callback-Funktion übergeben worden, die den Einsatz table2 tut. Während es seltsam ist, werfen sie den Fehler, scheint sich zu beschweren, dass "fk" noch nicht existiert, wenn Datensätze für Tabelle2 eingefügt werden, zumindest wenn die Callback-Funktion ausgeführt wird.

Was sind Ihre Vorschläge, um diese Konflikte zu lösen?

Antwort

1

Ich nehme an, Sie machen zwei getrennte Verbindungen in zwei Funktionen. ? Vielleicht ist uploadTable1 Transaktion noch nicht verpflichtet, wenn Sie uploadTable2("kk1","ff1") versuchen ..

Mit dieser Annahme gemacht, versuchen uploadTable1 auf sich ändernde:

function uploadTable1(name,callback){ 
    const client = new pg.Client(conString); 
    client.connect(); 
    client.on("drain", function() { 
    client.end(); 
    let insertTable1 = client.query(`INSERT INTO table1 (obj_name) VALUES ($1) RETURNING obj_id`, [name]); 
    insertTable1.on("row", function (row,result) { 
     callback(row.obj_id); 
    }); 
    }); 

mit Idee, dass client.end(); Verbindung beenden wird „gezwungen“ zu begehen. ..

Oder betrachten Sie den Code umschreiben zwei Anweisungen in einer Sitzung ausgeführt werden, eine Transaktion statt ...

+1

Vielen Dank für Ihren Hinweis. Die Grundursache ist, dass Sie die 1. Sitzung der Datenbank, die noch nicht verbunden ist, erwähnt haben, während die 2. Sitzung versucht, auf diesen neu hinzugefügten Datensatz zu verweisen. Ihr Code funktioniert nicht, wenn Sie disconnect von myside ausführen, während ich Ihren zweiten Vorschlag nenne, zwei Anweisungen in eine Sitzung umzuschreiben, und es funktioniert perfekt. Danke noch einmal. – Robin

Verwandte Themen