TypeORM comment vérifier si l'exécution de la requête fini?

0

La question

Je suis en train de construire un nestjs application qui utilise typeorm pour communiquer avec postgres.

Mes tables sont créées dynamiquement, et les données sont insérées de manière dynamique. C'est pourquoi je crus requête au lieu d'entités.

Le problème est que certaines des données dans des tables liées entre elles et je ne peux pas insérer de nouvelles données, sauf si l'précédente requête d'insertion est terminée.

Comment puis-je vérifier si l'exécution de la requête fini? Voici un exemple de flux de travail que j'utilise. Il travaille avec des données de petite taille, mais échoue avec le big data (10 000 000 entrées et plus)

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

Résultat souhaité est d'avoir une fonction de rappel pour l' queryRunner.query comme ceci queryRunner.query('raw_sql', (err, res) => {})

Est-il possible avec typeorm?

Merci

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

La meilleure réponse

1

La façon dont votre code est écrit, la validation des transactions ne sera possible après l'insertion de finitions. Ce qui signifie que, à ce stade, vous pouvez également exécuter votre requête. Vous n'avez pas nécessairement besoin d'un rappel parce que vous êtes à l'aide de la async/await syntaxe.

Cependant, il semble qu'avec de très grands inserts, quelque chose de mal se passe (une sorte de requête/délai d'attente de connexion, ou de ressources du serveur de l'échec). Essayez de débogage/impression de l'erreur pour voir ce qui est vraiment arrivé.

Je vous suggère d'essayer de diviser l'insert en plusieurs lots (de quelque chose comme 1k enregistrements, par exemple).

2021-11-23 16:26:07

Salut. Merci pour le tuyau à la validation des transactions. Qui sonne comme un bon endroit où je peux exécuter une nouvelle requête. Et oui. J'ai divisé mes données en morceaux. Après quelques tests j'ai fini avec 50k entrées par bloc, pour être optimale. (généralement les données entrantes sont plus d'un million)
Getsumi3

Dans d'autres langues

Cette page est dans d'autres langues

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