TypeORM jak zkontrolovat, zda spuštění dotazu skončil?

0

Otázka

Stavím nestjs aplikace, která používá typeorm komunikovat s postgres.

Moje tabulky jsou vytvářeny dynamicky, a dat je vložen také dynamicky. To je důvod, proč používám raw query namísto subjekty.

Problém je, že některé údaje v tabulkách jsou související a nemůžu vložit nové údaje, pokud předchozí vložit dotaz dokončil.

Jak mohu zkontrolovat, zda spuštění dotazu skončil? Zde je příklad pracovního postupu, které používám. To funguje s malými data, ale nedokáže s velkými daty (10 000 000 položek a více)

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

Požadovaný výsledek je, aby některé zpětné volání pro queryRunner.query takhle queryRunner.query('raw_sql', (err, res) => {})

Je to možné s typeorm?

Díky

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

Nejlepší odpověď

1

Tak, jak je kód napsán, potvrzení transakce dojde pouze po vložení povrchové úpravy. Což znamená, že v tomto okamžiku můžete také spustit váš nový dotaz. Nemusíte nutně potřebovat zpětné volání, protože jste pomocí async/await v syntaxi.

Zdá se však, že s velmi velkými vložkami, se děje něco špatného (nějaký dotaz/časový limit připojení nebo server resource selhání). Zkuste ladění/tiskové chyby, aby viděli, co se opravdu stalo.

Doporučuji vám pokusit se rozdělit-li vložit do více dávek (něco jako 1k záznamy, například).

2021-11-23 16:26:07

Ahoj. Díky za upozornění na potvrzení transakce. Vlastně to zní jako dobré místo, kde bych mohl spustit nový dotaz. A ano. Roztrhla jsem si data na kousky. Po nějaké testy jsem skončil s 50 záznamů za kus, aby bylo optimální. (obvykle příchozích dat je více než jeden milion)
Getsumi3

V jiných jazycích

Tato stránka je v jiných jazycích

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