Het directe antwoord op uw vraag is om een opgeslagen procedure te gebruiken om een upsert te doen.
Zoiets werkt prima met de pg-module.
client.query({
text: "SELECT upsert($1, $2, $3, $4, $5, $6)"
values: [ obj.id,
obj.first_name,
obj.last_name,
1,
ip,
date_now.getFullYear() + "-" + month + "-" + date_now.getDate() + " " + date_now.getHours() + ":" + date_now.getMinutes() + ":" + date_now.getSeconds()
]
}, function(u_err, u_result){
if(err) // this is a real error, handle it
// otherwise your data is updated or inserted properly
});
Dit veronderstelt natuurlijk dat je een soort modelobject gebruikt dat alle waarden heeft die je nodig hebt, zelfs als ze niet veranderen. Je moet ze allemaal in de upsert doorgeven. Als je vastzit op de manier die je hier hebt getoond, moet je waarschijnlijk het werkelijke foutobject na de update controleren om te bepalen of het is mislukt omdat de rij er al is, of om een andere reden (wat een echte db-fout is die moet worden afgehandeld).
Dan heb je te maken met de potentiële race-conditie tussen het moment dat je update mislukt en de tijd dat je insert doorgaat. Als een andere functie probeert in te voegen met dezelfde id, heb je een probleem. Transacties zijn daar goed voor. Dat is alles wat ik nu heb. Ik hoop dat het helpt.