TypeORM jak sprawdzić, zakończone czy wykonanie zapytania?

0

Pytanie

Tworzę aplikację nestjs, która wykorzystuje typeorm do komunikacji z postgresql.

Moje tabele są tworzone dynamicznie, i dane są wstawiane również dynamicznie. Dlatego używam surowe zapytanie zamiast encji.

Problem w tym, że niektóre dane w tabelach są związane i nie mogę wstawić nowe dane, podczas gdy poprzedni wniosek na wkładkę nie zostanie zakończony.

Jak sprawdzić, zakończone czy wykonanie zapytania? Oto przykład pracy, który używam. Pracuje z kilkoma danymi, ale nie działa z dużymi danymi (10 000 000 rekordów i więcej).

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żądany wynik-mieć niektóre wywołania zwrotnego queryRunner.query podobny do tego queryRunner.query('raw_sql', (err, res) => {})

Czy jest to możliwe za pomocą typeorm?

Dziękuję

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

Najlepsza odpowiedź

1

Sądząc po tym, jak napisany kod, blokada transakcji nastąpi dopiero po zakończeniu wstawiania. Oznacza to, że w tym momencie można również wykonać swój nowy wniosek. Nie zawsze potrzebny jest wywołanie zwrotne, bo używasz składnia async/await.

Wydaje się jednak, że przy bardzo dużych wstawkami dzieje się coś złego (jakiś limit czasu żądania/połączenia lub awarii zasobów serwera). Spróbuj debugowania/wydrukować błąd, aby zobaczyć, co tak naprawdę się stało.

Proponuję spróbować podzielić wkładkę na kilka pakietów (na przykład, z około 1 tys. rekordów).

2021-11-23 16:26:07

Witam. Dzięki, że podałeś na zatwierdzenie transakcji. To faktycznie brzmi jak dobre miejsce, gdzie mogę wykonać nowe żądanie. I tak. Ja podzieliłem swoje dane na kawałki. Po niektórych testów dostałem 50 tysięcy wpisów na kawałek, aby być najlepszym. (zwykle przychodzących danych ponad milion)
Getsumi3

W innych językach

Ta strona jest w innych językach

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