Vladddosss
@Vladddosss

TypeOrm, как правильно использовать query runner?

Как при транзакции указать при этих сохранениях в какие таблицы сохранять?
Имею ввиду createQueryBuilder save.

const queryRunner = this.dataSource.createQueryRunner();

    await queryRunner.connect();
    await queryRunner.startTransaction();

    try {
      const passwordHah = await this.generatePasswordHash(dto.password);

      const user = await queryRunner.manager
        .createQueryBuilder()
        .update({ id: userId, password: passwordHah })
        .where('id = :userId', { userId })
        .returning('*')
        .updateEntity(true)
        .execute();

      const r = await queryRunner.manager.save({
        user: { id: userId },
      });
      console.log(user, r, 'res');
      await queryRunner.commitTransaction();
}

Если делаю так, то выдаёт ошибку:

const User = new UserEntity();

      const user = await queryRunner.manager
        .getRepository(User)
        .createQueryBuilder()
        .update({ id: userId, password: passwordHah })
        .where('id = :userId', { userId })
        .returning('*')
        .updateEntity(true)
        .execute();

Argument of type 'UserEntity' is not assignable to parameter of type 'EntityTarget<ObjectLiteral>'.


Вопрос мастерам:

Если сохранять/обновлять/удалять не через await queryRunner.manager , как показано в доке, а делать это, как обычно через .createQueryBuilder() или .save/.update методы, но внутри транзакции, это будет приводить к откату в при ошибке в одном из методов?
  • Вопрос задан
  • 415 просмотров
Решения вопроса 1
Vladddosss
@Vladddosss Автор вопроса
Чтобы транзакции работали нужно queryRunner передать createQueryBuilder.
Касательно примечания в конце вопроса, ответ - нет. Так транзакции работать не будут.

const queryRunner = this.dataSource.createQueryRunner();
    queryRunner.connect();
    queryRunner.startTransaction();

    try {
      const u = await this.repository
        .createQueryBuilder('u', queryRunner)
        .update({ password: passwordHash })
        .where('email = :email', { email: user.email })
        .returning('*')
        .updateEntity(true)
        .execute();

      const p = await this.passwordUpdateLogsRepository
        .createQueryBuilder('p', queryRunner)
        .insert()
        .values({ user: { id: user.id } })
        .execute();

      queryRunner.commitTransaction();

      return new HttpException(lang.ru.passwordChanged, HttpStatus.OK);
    } catch (error) {
      console.log(error);
      queryRunner.rollbackTransaction();
      throw new BadRequestException(lang.ru.error);
    } finally {
      queryRunner.release();
    }
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы