sql >> Base de Datos >  >> RDS >> PostgreSQL

Upsert en Postgres usando node.js

La respuesta inmediata a su pregunta es usar un procedimiento almacenado para hacer un upsert.

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

Algo así funciona bien con el módulo 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
});

Por supuesto, esto supone que está utilizando algún tipo de objeto modelo que tiene todos los valores que necesita, incluso si no están cambiando. Tienes que pasarlos todos al upsert. Si está atascado haciéndolo de la manera que se muestra aquí, probablemente debería verificar el objeto de error real después de la actualización para determinar si falló porque la fila ya está allí, o por alguna otra razón (que es un error de base de datos real que necesita ser manejado).

Luego, debe lidiar con la posible condición de carrera entre el momento en que falló la actualización y el momento en que se realiza la inserción. Si alguna otra función intenta insertar con la misma identificación, tiene un problema. Las transacciones son buenas para eso. Eso es todo lo que tengo ahora. Espero que ayude.