sql >> Databasteknik >  >> RDS >> PostgreSQL

Upsert i Postgres med node.js

Det omedelbara svaret på din fråga är att använda en lagrad procedur för att göra en upsert.

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

Något liknande detta fungerar bra med pg-modulen.

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
});

Detta förutsätter naturligtvis att du använder något slags modellobjekt som har alla värden du behöver, även om de inte ändras. Du måste skicka dem alla till uppsvinget. Om du har fastnat med att göra det som du har visat här, bör du förmodligen kontrollera det faktiska felobjektet efter uppdateringen för att avgöra om det misslyckades eftersom raden redan finns där, eller av någon annan anledning (vilket är ett verkligt db-fel som måste hanteras).

Sedan måste du ta itu med det potentiella rastillståndet mellan det att din uppdatering misslyckades och den tid som din insats går igenom. Om någon annan funktion försöker infoga med samma id, har du ett problem. Transaktioner är bra för det. Det är allt jag har just nu. Hoppas det hjälper.



  1. SQL-fråga för de senaste meddelandena

  2. Varför fungerar inte pi()-funktionen i Oracle med dess JDBC-drivrutin?

  3. Iterera genom tabellen, utför beräkning på varje rad

  4. fe_sendauth:inget lösenord tillhandahålls