TypeORM как проверить, завершено ли выполнение запроса?

0

Вопрос

Я создаю приложение nestjs, которое использует typeorm для связи с postgres.

Мои таблицы создаются динамически, и данные вставляются также динамически. Вот почему я использую необработанный запрос вместо сущностей.

Проблема в том, что некоторые данные в таблицах связаны, и я не могу вставить новые данные, пока предыдущий запрос на вставку не будет завершен.

Как проверить, завершено ли выполнение запроса? Вот пример рабочего процесса, который я использую. Он работает с небольшими данными, но не работает с большими данными (10 000 000 записей и более).

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

Желаемый результат-иметь некоторый обратный вызов для queryRunner.query подобный этому queryRunner.query('raw_sql', (err, res) => {})

Возможно ли это с помощью typeorm?

Спасибо

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

Лучший ответ

1

Судя по тому, как написан ваш код, фиксация транзакции произойдет только после завершения вставки. Это означает, что в этот момент вы также можете выполнить свой новый запрос. Вам не обязательно нужен обратный вызов, потому что вы используете синтаксис async/await.

Однако, похоже, что при очень больших вставках происходит что-то неправильное (какой-то тайм-аут запроса/подключения или сбой ресурсов сервера). Попробуйте отладить/распечатать ошибку, чтобы увидеть, что произошло на самом деле.

Я предлагаю вам попытаться разделить вставку на несколько пакетов (например, из примерно 1 тыс. записей).

2021-11-23 16:26:07

Привет. Спасибо, что указали на фиксацию транзакции. Это на самом деле звучит как хорошее место, где я могу выполнить новый запрос. И да. Я разделил свои данные на куски. После некоторых тестов я получил 50 тысяч записей на кусок, чтобы быть оптимальным. (обычно входящих данных более миллиона)
Getsumi3

На других языках

Эта страница на других языках

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