TypeORM come verificare se l'esecuzione di query finito?

0

Domanda

Sto costruendo una nestjs applicazione che utilizza typeorm per comunicare con postgres.

Le tabelle vengono create dinamicamente, e i dati vengono inseriti anche in modo dinamico. Ecco perché io uso il raw query invece di entità.

Il problema è che alcuni dei dati nelle tabelle sono relative e non riesco ad inserire nuovi dati, a meno che la precedente query di inserimento è finito.

Come faccio a controllare se l'esecuzione di query finito? Qui è un esempio di flusso di lavoro che uso io. Funziona con dati di piccole dimensioni, ma non riesce con i big data (10 000 000 voci e di più)

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();
        }
    }
}

Il risultato desiderato è quello di avere alcuni di callback per queryRunner.query come questo queryRunner.query('raw_sql', (err, res) => {})

E ' possibile con typeorm?

Grazie

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

Migliore risposta

1

Il modo in cui il codice è stato scritto, il commit della transazione potrà avvenire solo dopo l'inserimento di finiture di pregio. Il che significa che, a quel punto si può anche eseguire una nuova query. Non hai necessariamente bisogno di un callback perché stai usando il async/await sintassi.

Tuttavia, sembra che con grandi inserti, qualcosa di sbagliato sta accadendo (una sorta di query/timeout di connessione, o di risorse del server fail). Provare il debug/stampa l'errore di vedere che cosa è realmente accaduto.

Ti suggerisco di provare a dividere l'inserto in più lotti (di qualcosa di simile a 1k record, per esempio).

2021-11-23 16:26:07

Ciao. Grazie per la segnalazione durante il commit della transazione. Che in realtà suona come un buon posto dove posso eseguire una nuova query. E sì. Ho diviso i miei dati in blocchi. Dopo alcuni test ho finito con 50k voci per blocco, per essere ottimale. (di solito dati in arrivo oltre un milione)
Getsumi3

In altre lingue

Questa pagina è in altre lingue

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