TypeORM cómo comprobar si la ejecución de la consulta terminado?

0

Pregunta

Estoy construyendo una nestjs aplicación que utiliza typeorm para comunicarse con el usuario postgres.

Mis tablas son creadas dinámicamente, y los datos se insertan también de forma dinámica. Es por eso que yo uso en crudo, consulta en lugar de entidades.

El problema es que algunos de los datos en tablas están relacionadas y yo no se puede insertar nuevos datos, a menos que previa consulta insert ha terminado.

¿Cómo puedo comprobar si la ejecución de la consulta terminado? Aquí es un ejemplo de flujo de trabajo que yo uso. Trabaja con pequeños datos, pero no con el big data (10 000 000 entradas y más)

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 deseado es tener algo de devolución de llamada para queryRunner.query como este queryRunner.query('raw_sql', (err, res) => {})

Es posible que con typeorm?

Gracias

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

Mejor respuesta

1

La forma en que se escribe el código, la confirmación de la transacción sólo ocurrirá después de la inserción de los acabados. Lo que significa que, en ese punto también se puede ejecutar una nueva consulta. Usted no necesariamente necesita una devolución de llamada porque estás usando el async/await sintaxis.

Sin embargo, parece que, con muy grandes insertos, algo malo está pasando (algún tipo de consulta/tiempo de espera de conexión, o de recursos de servidor de fallar). Trate de depuración/impresión del error para ver lo que realmente sucedió.

Le sugiero que intente dividir la inserción en varios lotes (de algo como 1k de registros, por ejemplo).

2021-11-23 16:26:07

Hola. Gracias por señalar en la confirmación de la transacción. Que en realidad suena como un buen lugar donde puedo ejecutar una nueva consulta. Y sí. Me separé de mis datos en trozos. Después de algunas pruebas que terminó con 50 mil entradas por el pedazo de ser óptimo. (generalmente los datos de entrada es de más de un millón)
Getsumi3

En otros idiomas

Esta página está en otros idiomas

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