💽
【データベース】ORMについて
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