node.js - Insertando múltiples registros con pg-promise
postgresql (1)
Soy el autor de pg-promise .
Hay dos formas de insertar múltiples registros. La primera forma, y la más típica, es a través de una transacción, para asegurarse de que todos los registros se insertan correctamente o ninguno de ellos.
Con pg-promise se hace de la siguiente manera:
db.tx(t => {
const queries = lst.map(l => {
return t.none(''INSERT INTO table(id, key, value) VALUES(${id}, ${key}, ${value})'', l);
});
return t.batch(queries);
})
.then(data => {
// SUCCESS
// data = array of null-s
})
.catch(error => {
// ERROR
});
Inicia una transacción con el método tx , luego crea todas las promesas de consulta INSERT
y luego las resuelve como un batch .
El segundo enfoque es mediante la concatenación de todos los valores de inserción en una única consulta INSERT
, que explico en detalle en Performance Boost . Ver también: inserción de varias filas con pg-promise .
Para más ejemplos ver Tasks y Transactions .
Adición
Vale la pena señalar que en la mayoría de los casos no insertamos un id
registro, sino que lo generamos automáticamente. A veces queremos recuperar el nuevo id-s, y en otros casos no nos importa.
Los ejemplos anteriores se resuelven con una matriz de null
-s, porque el batch resuelve con una matriz de resultados individuales, y el método none resuelve con null
, de acuerdo con su API.
Supongamos que queremos generar los nuevos id-s, y que queremos recuperarlos a todos. Para lograr esto, cambiaríamos el código a lo siguiente:
db.tx(t => {
const queries = lst.map(l => {
return t.one(''INSERT INTO table(key, value) VALUES(${key}, ${value}) RETURNING id'',
l, a => +a.id);
});
return t.batch(queries);
})
.then(data => {
// SUCCESS
// data = array of new id-s;
})
.catch(error => {
// ERROR
});
Es decir, los cambios son:
- no insertamos los valores de
id
- reemplazamos el método none por one , para obtener una fila / objeto de cada inserción
-
RETURNING id
a la consulta para obtener el valor - añadimos
a => +a.id
para hacer la transformación automática de filas. Vea también pg-promise devuelve enteros como cadenas para entender para qué es+
.
ACTUALIZACIÓN-1
Para obtener un enfoque de alto rendimiento a través de una única consulta INSERT
vea Insertar en varias filas con pg-promise .
ACTUALIZACIÓN-2
Un artículo que hay que leer: Importaciones de datos .
Tengo un escenario en el que necesito insertar múltiples registros. Tengo una estructura de tabla como id (es fk de otra tabla), clave (char), valor (char). La entrada que se debe guardar sería una matriz de los datos anteriores. Ejemplo: Tengo algunos objetos de matriz como:
lst = [];
obj = {};
obj.id= 123;
obj.key = ''somekey'';
obj.value = ''1234'';
lst.push(obj);
obj = {};
obj.id= 123;
obj.key = ''somekey1'';
obj.value = ''12345'';
lst.push(obj);
En MS SQL, hubiera creado TVP y lo hubiera pasado. No sé cómo lograr en postgres. Así que ahora lo que quiero hacer es guardar todos los elementos de la lista en una sola consulta en postgres sql, usando la biblioteca pg-promise. No puedo encontrar ninguna documentación / comprensión de la documentación. Cualquier ayuda apreciada. Gracias.