高瀬博道の技術ブログ

高瀬博道の技術ブログです。

NestJS でデータベース操作できるようにする - 4

前回

takasehiromichiex.com

TypeORM トランザクション

TypeORMでトランザクションを処理することができます。

src/user/user.service.ts
import { Injectable } from "@nestjs/common";
import { InjectRepository } from "@nestjs/typeorm";
import { DataSource, DeleteResult, Repository } from "typeorm";
import { CreateUserDto } from "./dto/create-user.dto";
import { UpdateUserDto } from "./dto/update-user.dto";
import { User } from "./entities/user.entity";

@Injectable()
export class UserService {
  constructor(
    @InjectRepository(User) private userRepository: Repository<User>,
    private dataSource: DataSource
  ) {}

  create(createUserDto: CreateUserDto) {
    return "This action adds a new user";
  }

  async createMany(users: User[]) {
    const queryRunner = this.dataSource.createQueryRunner();
    await queryRunner.connect();
    await queryRunner.startTransaction();

    try {
      await queryRunner.manager.save(users[0]);
      await queryRunner.manager.save(users[1]);
      await queryRunner.commitTransaction();
    } catch (error) {
      await queryRunner.rollbackTransaction();
    } finally {
      await queryRunner.release();
    }
  }

  findAll(): Promise<User[]> {
    return this.userRepository.find();
  }

  findOne(id: number): Promise<User> {
    return this.userRepository.findOneBy({ id });
  }

  update(id: number, updateUserDto: UpdateUserDto) {
    return `This action updates a #${id} user`;
  }

  async remove(id: number): Promise<DeleteResult> {
    return await this.userRepository.delete(id);
  }
}

まず、コンストラクタでprivate dataSource: DataSourceをDIします。

次に、async createMany(users: User[])を実装します。

そこで、this.dataSource.createQueryRunner()からqueryRunnerを生成し、await queryRunner.connect();await queryRunner.startTransaction();にて、処理を開始します。

その後、await queryRunner.manager.saveで書き込みを行い、await queryRunner.commitTransactionでトランザクションをコミットします。

失敗した場合は、await queryRunner.rollbackTransaction()でロールバックを行います。

いずれの場合も、await queryRunner.release()でコネクションをリリースします。

まとめ

ここまでで、

  • TypeORM トランザクションについて

を学びました。

次回もデータベース操作を掘り下げようと思います。

コード

今回のコードは、以下に格納しました。

github.com

takasehiromichiex.com