Natychmiastową odpowiedzią na twoje pytanie jest użycie procedury składowanej do wykonania upsert.
Coś takiego działa dobrze z modułem pg.
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
});
Oczywiście zakłada to, że używasz jakiegoś obiektu modelu, który ma wszystkie potrzebne wartości, nawet jeśli się nie zmieniają. Musisz je wszystkie przekazać do znużenia. Jeśli utkniesz, robiąc to w sposób, który tutaj pokazano, powinieneś prawdopodobnie sprawdzić rzeczywisty obiekt błędu po aktualizacji, aby ustalić, czy nie powiodło się, ponieważ wiersz już tam jest, lub z jakiegoś innego powodu (który jest prawdziwym błędem bazy danych, który musi być obsługiwane).
Następnie musisz poradzić sobie z potencjalnym wyścigiem między momentem niepowodzenia aktualizacji a czasem przejścia przez wstawkę. Jeśli jakaś inna funkcja próbuje wstawić z tym samym identyfikatorem, masz problem. Transakcje są do tego dobre. To wszystko, co mam teraz. Mam nadzieję, że to pomoże.