💽

【データベース】ORMについて

2024/12/10に公開

ORMとは

Object-Relational Mappingは、オブジェクト指向プログラミングの概念を使用してリレーショナルデータベース内のデータを操作するプログラミング手法です。
クラスとデータベースのテーブルをマッピングすることから始めます。
これによって、直接SQLを作成することなく、ORMを通じてデータベースのデータを操作することができます。

ORMのイメージ図

下記のように userRepository.find() を実行することで、間接的に SELECT * FROM users; を実行していることになります。

NestJSでTypeORMを使って実装する方法

1.エンティティの作成

Userエンティティを作成します。
エンティティとは実世界の対象物をデータベースで表現するための単位のことです。

@Entity('users')を使用することで、エンティティクラスとデータベーステーブルを紐づけています。
このクラスがデータベースのテーブル構造に対応します。

user.ts
import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';

@Entity('users') // データベーステーブル名
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  name: string;

  @Column()
  email: string;
}

2.リポジトリの設定

TypeOrmModuleを使ってリポジトリを注入します。

user.module.ts

@Module({
  imports: [TypeOrmModule.forFeature([User])],
  providers: [UserService],
  controllers: [UserController],
})
export class UserModule {}

3.サービスでロジックを記述

user.service.ts
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { User } from './user.entity';

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

  async findAll(): Promise<User[]> {
    return this.userRepository.find(); // 全ユーザー情報を取得
  }
}

4.コントローラでエンドポイントを定義

user.controller.ts
import { Controller, Get } from '@nestjs/common';
import { UserService } from './user.service';
import { User } from './user.entity';

@Controller('users')
export class UserController {
  constructor(private readonly userService: UserService) {}

  @Get()
  async getAllUsers(): Promise<User[]> {
    return this.userService.findAll();  // 全ユーザー情報を返す
  }
}

5.アプリ全体でTypeORMを設定

app.module.ts
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { UserModule } from './user/user.module';

@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: 'mysql', // 使用するデータベース(例: MySQL)
      host: 'localhost',
      port: 3000,
      username: 'root',
      password: 'password',
      database: 'test',
      entities: [__dirname + '/**/*.entity{.ts,.js}'],
      synchronize: true, // 本番環境ではfalseにする
    })
  ],
})

Discussion