Bezprostřední odpovědí na vaši otázku je použití uložené procedury k provedení upsert.
Něco takového funguje dobře s modulem 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
});
Samozřejmě to předpokládá, že používáte nějaký typ objektu modelu, který má všechny hodnoty, které potřebujete, i když se nemění. Musíte je všechny předat do upsert. Pokud to děláte tak, jak jste to ukázali zde, měli byste pravděpodobně zkontrolovat skutečný chybový objekt po aktualizaci, abyste zjistili, zda selhal, protože řádek již existuje, nebo z nějakého jiného důvodu (což je skutečná chyba db, která je třeba zpracovat).
Pak se musíte vypořádat s potenciálním závodem mezi okamžikem, kdy se vaše aktualizace nezdařila, a časem, kterým projde vaše vložka. Pokud se nějaká jiná funkce pokusí vložit se stejným ID, máte problém. Na to jsou dobré transakce. To je vše, co teď mám. Doufám, že to pomůže.