Eu sou o autor de pg-promise .
Há duas maneiras de inserir vários registros. A primeira e mais comum maneira é através de uma transação, para garantir que todos os registros sejam inseridos corretamente, ou nenhum deles.
Com pg-promise é feito da seguinte forma:
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
});
Você inicia uma transação com o método tx , crie todos os
INSERT
promessas de consulta e, em seguida, resolva todas elas como um lote
. A segunda abordagem é concatenar todos os valores de inserção em um único
INSERT
consulta, que explico em detalhes em Aumento de desempenho
. Veja também:Inserção de várias linhas com pg-promise . Para obter mais exemplos, consulte Tarefas e Transações .
Adição
Vale ressaltar que na maioria dos casos não inserimos um registro
id
, em vez de tê-lo gerado automaticamente. Às vezes queremos recuperar os novos id-s, e em outros casos não nos importamos. Os exemplos acima resolvem com um array de
null
-s, porque lote
resolve com uma série de resultados individuais e o método none
resolve com null
, de acordo com sua API. Vamos supor que queremos gerar os novos id-s e que queremos recuperá-los todos. Para fazer isso, mudaríamos o código para o seguinte:
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
});
ou seja, as alterações são:
- não inserimos o
id
valores - substituimos o método nenhum com um , para obter uma linha/objeto de cada inserção
- anexamos
RETURNING id
à consulta para obter o valor - adicionamos
a => +a.id
para fazer a transformação automática de linha. Veja também pg-promise retorna inteiros como strings para entender o que+
é para.
ATUALIZAÇÃO-1
Para uma abordagem de alto desempenho por meio de um único
INSERT
consulta consulte Inserção de várias linhas com pg-promise . ATUALIZAÇÃO-2
Um artigo de leitura obrigatória:Importações de dados .