TypeORM como verificar se a execução da consulta terminou?

0

Pergunta

Eu estou construindo um nestjs aplicativo que usa typeorm para se comunicar com o postgres.

Meu tabelas são criadas dinamicamente, e os dados são inseridos também dinamicamente. É por isso que eu usar matérias de consulta em vez de entidades.

O problema é que alguns dados em tabelas relacionadas e eu não pode inserir novos dados, a menos que a anterior inserir consulta terminou.

Como faço para verificar se de execução de consulta terminou? Aqui está um exemplo de fluxo de trabalho que eu uso. Ele trabalha com dados pequeno, mas falha com grandes volumes de dados (10 000 000 entradas e mais)

export class Test {
    constructor(
        private readonly connection: Connection;
    ) {}

    public async insertData(table1, table2, arr1, arr2) {
        await insertInto(table1, arr1);
        //I want second insertInto() to be executed after I get confirmation from database that insertInto() from above is finished
        await insertInto(table2, arr2);
    }

    private async insertInto(table, data) {
        const queryRunner = this.connection.createQueryRunner();
        await queryRunner.connect();
        await queryRunner.startTransaction();

        const preparedData = [];
        
        //prepare data to be inserted as raw query
        //...

        try {
            await queryRunner.query(`INSERT IGNORE INTO "${table}" VALUES ${preparedData}`);
            await queryRunner.commitTransaction();
        } catch (e) {
            await queryRunner.rollbackTransaction();
            throw new InternalServerErrorException(e, Error while executing custom query. Rollback transaction.)
        } finally {
            await queryRunner.release();
        }
    }
}

Resultado desejado é ter algum retorno de chamada para queryRunner.query como este queryRunner.query('raw_sql', (err, res) => {})

Isso é possível com o typeorm?

Obrigado

nestjs node.js-typeorm postgresql sql
2021-11-23 15:59:14
1

Melhor resposta

1

A forma como o código é escrito, o commit da transação só vai acontecer depois que a inserção de acabamentos. O que significa que, nesse ponto, você pode também executar a sua nova consulta. Você não necessariamente precisa de um retorno, porque você está usando o async/await sintaxe.

No entanto, parece que com muito grande pastilhas, algo de errado está acontecendo (algum tipo de consulta/tempo limite de conexão, ou de recursos de servidor de falhar). Tente de depuração e imprimir o erro para ver o que realmente aconteceu.

Eu sugiro que você tente dividir a inserir em vários lotes (algo como 1k de registros, por exemplo).

2021-11-23 16:26:07

Olá. Obrigado por apontar no commit da transação. Que, na verdade, soa como um bom lugar onde eu possa executar uma nova consulta. E sim. Vou dividir a minha dados em pedaços. Depois de alguns testes, acabei com 50 mil entradas por trecho de ser o ideal. (normalmente dados de entrada são mais de um milhão)
Getsumi3

Em outros idiomas

Esta página está em outros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................