PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Upsert dans Postgres en utilisant node.js

La réponse immédiate à votre question est d'utiliser une procédure stockée pour effectuer une mise à jour.

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

Quelque chose comme ça fonctionne bien avec le module 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
});

Bien sûr, cela suppose que vous utilisez une sorte d'objet modèle qui a toutes les valeurs dont vous avez besoin, même si elles ne changent pas. Vous devez tous les passer dans l'upsert. Si vous êtes coincé à le faire comme vous l'avez montré ici, vous devriez probablement vérifier l'objet d'erreur réel après la mise à jour pour déterminer s'il a échoué parce que la ligne est déjà là, ou pour une autre raison (qui est une véritable erreur de base de données qui doit être manipulé).

Ensuite, vous devez faire face à la condition de concurrence potentielle entre le moment où votre mise à jour a échoué et le moment où votre insertion est effectuée. Si une autre fonction essaie d'insérer avec le même identifiant, vous avez un problème. Les transactions sont bonnes pour cela. C'est tout ce que j'ai pour l'instant. J'espère que ça aide.