Soy el autor de pg-promise .
Hay dos formas de insertar varios registros. La primera y más típica forma es a través de una transacción, para asegurarse de que todos los registros se inserten 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 todos los INSERT
consulta las promesas y luego resuélvelas todas como un lote
.
El segundo enfoque consiste en concatenar todos los valores de inserción en un solo INSERT
consulta, que explico en detalle en Performance Boost
. Consulte también:Inserción de varias filas con pg-promise .
Para obtener más ejemplos, consulte Tareas y Transacciones .
Adición
Vale la pena señalar que en la mayoría de los casos no insertamos un registro id
, más bien haz que se genere automáticamente. A veces queremos recuperar las nuevas identificaciones y, en otros casos, no nos importa.
Los ejemplos anteriores se resuelven con una matriz de null
-s, porque lote
se resuelve con una matriz de resultados individuales y el método none
se resuelve con null
, según su API.
Supongamos que queremos generar los nuevos id-s y que queremos recuperarlos 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 el
id
valores - reemplazamos el método ninguno con uno , para obtener una fila/objeto de cada inserción
- añadimos
RETURNING id
a la consulta para obtener el valor - agregamos
a => +a.id
para hacer la transformación automática de filas. Ver también pg-promise devuelve enteros como cadenas para entender lo que+
es para.
ACTUALIZACIÓN-1
Para un enfoque de alto rendimiento a través de un solo INSERT
consulta ver Inserción de varias filas con pg-promise .
ACTUALIZACIÓN-2
Un artículo de lectura obligada:Importaciones de datos .