PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Upsert in Postgres usando node.js

La risposta immediata alla tua domanda è utilizzare una procedura memorizzata per eseguire un upsert.

http://www.postgresql .org/docs/current/static/plpgsql-control-structures.html#PLPGSQL-UPSERT-EXAMPLE

Qualcosa del genere funziona bene con il modulo 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
});

Ovviamente questo presuppone che tu stia utilizzando una sorta di oggetto modello che ha tutti i valori di cui hai bisogno, anche se non stanno cambiando. Devi passarli tutti nell'upsert. Se sei bloccato a farlo nel modo in cui hai mostrato qui, dovresti probabilmente controllare l'oggetto di errore effettivo dopo l'aggiornamento per determinare se non è riuscito perché la riga è già lì, o per qualche altro motivo (che è un vero errore db che deve essere gestito).

Quindi devi affrontare la potenziale condizione di competizione tra il momento in cui l'aggiornamento non è riuscito e il momento in cui l'inserto è stato completato. Se qualche altra funzione tenta di inserire con lo stesso ID, hai un problema. Le transazioni sono buone per questo. Questo è tutto ciò che ho adesso. Spero che aiuti.