запустить много транзакций typeorm в цикле JavaScript - PullRequest
0 голосов
/ 01 марта 2019

В моем приложении Electron я хотел бы вводить данные (например, Fixtures) при запуске приложения.

Я использую библиотеку typeorm для управления подключением к базе данных SQLite3.

Я создал JSON-файл, который представляет собой Entity typeorm, и я хотел бы сохранить их все в моей БД с помощью typeorm.Для этого кажется, что использование trasaction более эффективно.

Я пробую две разные вещи, но результат один и тот же, и я не понимаю, почему.Сообщение о проблеме:

Ошибка: транзакция уже запущена для данного соединения, передайте новую транзакцию перед началом новой

Моя первая реализация транзакции :

async setAll(entity, data)
{
    let connection = await this.init()
    const queryRunner = connection.createQueryRunner()
    await queryRunner.connect()

    for (const [key, value] of Object.entries(data))
    {
        await typeorm.getManager().transaction(transactionalEntityManager =>
        {

        })
    }
}

Моя вторая реализация транзакции :

async setAll(entity, data)
{
    let connection = await this.init()
    const queryRunner = connection.createQueryRunner()
    await queryRunner.connect()

    for (const [key, value] of Object.entries(data))
    {
        let genre1 = new Genre()
        genre1.name = 'toto'
        genre1.identifier = 'gt'
        genre1.logo = ''
        genre1.isActivate = false

        await queryRunner.startTransaction()
        await queryRunner.manager.save(genre1)
        await queryRunner.commitTransaction()
        await queryRunner.release()
    }
}

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

Как можно управлять множеством транзакций типа, созданных в цикле для постоянной партии данных?

1 Ответ

0 голосов
/ 26 августа 2019
async setAll(entity, data) {
    let connection = await this.init()
    const queryRunner = connection.createQueryRunner()
    await queryRunner.connect()
    await queryRunner.startTransaction()
    try {
        for (const [key, value] of Object.entries(data)) {
            let genre1 = new Genre()
            genre1.name = 'toto'
            genre1.identifier = 'gt'
            genre1.logo = ''
            genre1.isActivate = false
          const newGenre= queryRunner.manager.create(Genre,genre1)
           await queryRunner.manager.save(newGenre)
            await queryRunner.commitTransaction()
        }
    } catch {
        await queryRunner.rollbackTransaction()
    } finally {
        await queryRunner.release()
    }
...