sql >> Database >  >> RDS >> PostgreSQL

Upsert in Postgres met node.js

Het directe antwoord op uw vraag is om een ​​opgeslagen procedure te gebruiken om een ​​upsert te doen.

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

Zoiets werkt prima met de pg-module.

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

Dit veronderstelt natuurlijk dat je een soort modelobject gebruikt dat alle waarden heeft die je nodig hebt, zelfs als ze niet veranderen. Je moet ze allemaal in de upsert doorgeven. Als je vastzit op de manier die je hier hebt getoond, moet je waarschijnlijk het werkelijke foutobject na de update controleren om te bepalen of het is mislukt omdat de rij er al is, of om een ​​andere reden (wat een echte db-fout is die moet worden afgehandeld).

Dan heb je te maken met de potentiële race-conditie tussen het moment dat je update mislukt en de tijd dat je insert doorgaat. Als een andere functie probeert in te voegen met dezelfde id, heb je een probleem. Transacties zijn daar goed voor. Dat is alles wat ik nu heb. Ik hoop dat het helpt.



  1. MySQL:selecteer de datum van de maandag van de huidige week

  2. ORACLE - ORA-01843:geen geldige maand

  3. Sorteer Multi-dimensional Array op gegeven indexen - PHP?

  4. Hoe expliciet_defaults_for_timestamp in te schakelen?