Esta puede ser una pregunta muy simple, aunque me tomó mucho tiempo y todavía no pude resolverla. Necesito dos tablas en postgresql y que se actualicen dinámicamente en mi aplicación nodejs. La tabla 1 tiene dos columnas (obj_id, obj_name), la tabla 2 tiene más columnas, mientras que incluye una columna como "obj_id", ya que "fk" se refiere al "obj_id" de la tabla 1; Intenté insertar un registro en la tabla 1 y luego realizar un procesamiento e insertar el registro correspondiente en la tabla 2. Necesito el valor "obj_id" devuelto desde la primera inserción y lo uso junto con otros valores para hacer la segunda inserción. Estoy tratando de hacer esto con el siguiente código, mientras que siempre arroja un error que dice ( insertar o actualizar en la tabla "table2" viola la restricción de clave externa "rel_table2_table1" ).
function uploadTable1(name,callback){ const client = new pg.Client(conString); client.connect(); client.on("drain", function () { client.end(); }); let insertTable1 = client.query(`INSERT INTO table1 (obj_name) VALUES ($1) RETURNING obj_id`, [name]); insertTable1.on("row", function (row,result) { callback(row.obj_id); });
}
function uploadTable2(kk,ff) { return function (obj_id) { const client = new pg.Client(conString); client.connect(); client.on("drain", function () { client.end(); }); let uploadQuery = client.query("INSERT INTO table2 (kk,ff,obj_id) VALUES ($1,$2, $3)",[kk,ff, obj_id]); } }
Puedo ejecutar estas dos funciones manualmente una por una para insertar registros sin problemas, mientras que cuando las ejecuto juntas en el programa principal como se muestra a continuación, obtuve los errores mencionados anteriormente.
uploadTable1("obj_name1",uploadTable2("kk1","ff1"));
Verifiqué que la tabla 1 se haya insertado correctamente y el valor del nuevo registro "obj_id" se haya pasado a la función de devolución de llamada que está haciendo la inserción de la tabla 2. Si bien lo extraño es que arrojan el error, parece que se quejan de que "fk" aún no existe cuando se insertan registros para la tabla 2, al menos cuando se ejecuta la función de devolución de llamada.
¿Cuáles son sus sugerencias para resolver estos conflictos?
Supongo que está haciendo dos conexiones separadas en dos funciones. ¿Tal vez la transacción uploadTable1
aún no se ha confirmado, cuando intenta uploadTable2("kk1","ff1")
? ..
Con esta suposición hecha, intente cambiar uploadTable1
a:
function uploadTable1(name,callback){ const client = new pg.Client(conString); client.connect(); client.on("drain", function () { client.end(); let insertTable1 = client.query(`INSERT INTO table1 (obj_name) VALUES ($1) RETURNING obj_id`, [name]); insertTable1.on("row", function (row,result) { callback(row.obj_id); }); });
con idea, que client.end();
terminará la conexión "forzando" la confirmación...
O considere reescribir el código para ejecutar dos declaraciones en una sesión, una transacción en su lugar...