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

  • 22 августа 2023 г. 14:46
Ответы на вопрос 14
Привет!

Для использования `query runner` в TypeOrm вы можете выполнить следующие шаги:

1. Создайте экземпляр `queryRunner` с помощью метода `createQueryBuilder`:

```typescript
const queryRunner = connection.createQueryRunner();
```

2. Начните транзакцию с помощью метода `startTransaction`:

```typescript
await queryRunner.startTransaction();
```

3. Выполните нужные вам операции с базой данных, используя `queryRunner`. Например, вы можете выполнить insert, update или delete операции:

```typescript
await queryRunner.query("INSERT INTO user (name) VALUES ('John')");
await queryRunner.query("UPDATE user SET age = 30 WHERE name = 'John'");
await queryRunner.query("DELETE FROM user WHERE age > 40");
```

4. Завершите транзакцию с помощью метода `commitTransaction`:

```typescript
await queryRunner.commitTransaction();
```

5. Не забудьте закрыть `queryRunner` после завершения:

```typescript
await queryRunner.release();
```

Примечание: Если в любой момент транзакции возникнет ошибка, вы можете откатить ее с помощью метода `rollbackTransaction`. Например:

```typescript
await queryRunner.rollbackTransaction();
```

Это все, что вам нужно знать для правильного использования `query runner` в TypeOrm. Удачи!
 задаем условие для обновления записей
    .returning('*') 
 указываем, что нужно вернуть обновленные записи
    .updateEntity(true) 
 указываем, что нужно обновить сущности в памяти
    .execute(); 
 выполняем запрос и получаем результат

  const p = await this.passwordUpdateLogsRepository
    .createQueryBuilder('p', queryRunner) 
 создаем экземпляр QueryBuilder, передавая в него аргументы ('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(); 
 освобождаем ресурсы
}
Чтобы транзакции работали, нужно использовать метод createQueryBuilder и передать в него объект queryRunner. Примечание в конце вопроса имеет отрицательный ответ - транзакции не будут работать, если не будут использованы указанные методы и блоки кода.
const queryRunner = this.dataSource.createQueryRunner();
queryRunner.connect();
queryRunner.startTransaction();

try {
  const u = await this.repository
    .createQueryBuilder('u', queryRunner) 
 создаем экземпляр QueryBuilder, передавая в него аргументы ('u', queryRunner)
    .update({ password: passwordHash })
    .where('email = :email', { email: user.email }) 
Похожие вопросы