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

Insertar múltiples registros con pg-promise

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 .