PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Inserindo vários registros com pg-promise


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 .