あなたの質問に対する直接の答えは、ストアドプロシージャを使用してアップサートを行うことです。
このようなものは、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
});
もちろん、これは、変更されていない場合でも、必要なすべての値を持つある種のモデルオブジェクトを使用していることを前提としています。それらすべてをアップサートに渡す必要があります。ここに示した方法でそれを実行できなくなった場合は、更新後に実際のエラーオブジェクトをチェックして、行がすでに存在するために失敗したかどうか、またはその他の理由で失敗したかどうかを判断する必要があります(これは実際のdbエラーです。処理する必要があります。
次に、更新が失敗してから挿入が完了するまでの間に発生する可能性のある競合状態に対処する必要があります。他の関数が同じIDで挿入しようとすると、問題が発生します。トランザクションはそのために適しています。私が今得たのはそれだけです。お役に立てば幸いです。