TypeORM を使用して NestJS アプリケーションで SQL データベースを使用する方法
TypeORM のフル機能の NestJS パッケージを使ってデータベース ゲームを強化してみませんか?
オブジェクト リレーショナル マッパー (ORM) は、オブジェクト リレーショナル マッピング手法を実装するライブラリです。これにより、好みの言語のオブジェクト指向パラダイムを使用して SQL データベース クエリを作成できるようになります。
TypeORM は、さまざまなデータベースとのインターフェイスを非常に簡単にする TypeScript ORM です。 SQL データベースで動作しますが、MongoDB などの NoSQL データベースともうまく連携します。
NestJS は、すぐに使用できる TypeORM の高レベルのサポートを提供します。専用の TypeORM パッケージにより、統合が比較的簡単になります。
ステップ 1: 依存関係のインストール
NestJS アプリケーションで TypeORM を使用する前に、ネイティブ NestJS パッケージおよび優先 SQL データベースとともに TypeORM をインストールする必要があります。 SQLite はシンプルでインストール不要のオプションです。
次のコマンドを実行して、npm パッケージ マネージャーを使用して TypeORM とそのネイティブ NestJS パッケージをインストールします。
npm install @nestjs/typeorm typeorm
次のコマンドを実行して SQLite をインストールします。
npm install sqlite3
ステップ 2: エンティティの作成
エンティティは、データベースに格納されているデータを定義するフィールドのコレクションです。 TypeORM はエンティティ ファイルを使用してデータベースにテーブルを作成します。
エンティティを作成するには、次の手順に従います。
- アプリケーション モジュールにファイルを作成し、NestJS 命名規則に従って名前を付けます (
.entity.ts )。 - エンティティ ファイルで、エンティティ、列、およびPrimaryGeneratedColumn デコレータをtypeorm からインポートします。
- エンティティ ファイルでクラスを作成し、エクスポートします。
- id、name など、データベースに必要な値をクラスに入力します。
- エンティティ デコレータを使用してエンティティ クラスにアノテーションを付けます。これにより、クラスが TypeORM でエンティティとして認識されるようになります。
- id プロパティに PrimaryGeneratedColumn デコレータで注釈を付けます。これにより、TypeORM にid を主キーとしてマークし、自動インクリメントするように指示されます。
- 残りのプロパティに列デコレータで注釈を付けます。これにより、それらがデータベースに列として追加されます。
例えば:
// src/test/test.entity.ts
import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';
@Entity()
export class Test {
@PrimaryGeneratedColumn()
id: number;
@Column()
property_1: string;
@Column()
property_2: string;
@Column()
property_3: string;
}
上記のエンティティ ファイルにより、データベースに次のテーブルが作成されます。
test | ||
---|---|---|
id | int(11) | PRIMARY KEY AUTO_INCREMENT |
property_1 | varchar(255) | |
property_2 | varchar(255) | |
property_3 | varchar(255) |
TypeORM のドキュメントでは、エンティティについてさらに詳しく説明しています。
ステップ 3: アプリケーションをデータベースに接続する
エンティティが設定されたので、アプリケーションをデータベースに接続する必要があります。この例では SQLite を使用します。
以下の手順に従って、アプリケーションをデータベースに接続します。
- アプリケーションのルート モジュール (通常は app.module.ts ファイル) で、@nestjs/typeorm から TypeOrmModule をインポートします。
- 同じファイルに、すべてのエンティティをインポートします。
- imports 配列で、TypeOrmModule のforRoot メソッドを呼び出します。 forRoot メソッドは、アプリケーション内のすべてのモジュールを通じてデータベース接続を共有します。
- 空のオブジェクトを引数として forRoot メソッドに渡します。これは TypeORM 構成オブジェクトになります。
- プロパティタイプを構成オブジェクトに追加し、 それを「sqlite」に設定します。 type プロパティは、使用しているデータベースの名前を示します。
- 別のプロパティ database を構成オブジェクトに追加し、 それを「test.db」 に設定します。データベース プロパティは、データベースの任意の名前を示します。
- 別のプロパティであるエンティティを構成オブジェクトに追加し、それを空の配列に設定します。空の配列に、前にインポートしたエンティティを入力します。
- 別のプロパティを追加して同期し、 それをtrueに設定します。このプロパティはエンティティをデータベースに同期し、コードを実行するたびに更新します。開発時のみ、このプロパティをtrueに設定してください。運用中は、データの損失を避けるために、 これをfalseに設定する必要があります。
// src/app.module.ts
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Test } from './test/test.entity';
import { Entity2 } from './entity/entity.entity';
import { TestModule } from './test/test.module';
@Module({
imports: [
TypeOrmModule.forRoot({
type: 'sqlite',
database: 'test.db',
entities: [Test, Entity2],
synchronize: true, //development only
}),
TestModule,
],
controllers: [],
providers: [],
})
export class AppModule {}
ステップ 4: リポジトリの作成
リポジトリは、データベース内のエンティティによって作成されたテーブルに対してクエリ (挿入、削除、保存、検索など) を行うために使用されるエンティティのアクセス層です。 TypeORM はリポジトリ設計パターンをサポートしているため、各エンティティは独自のリポジトリを持ちます。
以下の手順に従うと、TypeORM はエンティティのリポジトリを自動的に作成します。
- エンティティのモジュール ファイルで、@nestjs/typeorm から TypeOrmModule をインポートし、エンティティをインポートします。
- @Module デコレータで imports 配列を作成します。
- imports 配列で、TypeOrmModule のforFeature メソッドを呼び出します。
- 配列を引数として渡し、その配列にエンティティを設定します。
// src/test/test.module.ts
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { TestController } from './test.controller';
import { TestService } from './test.service';
import { Test } from './test.entity';
@Module({
imports: [TypeOrmModule.forFeature([Test])],
providers: [TestService],
controllers: [TestController],
})
ステップ 5: 依存関係の注入を使用してリポジトリをサービスに注入する
依存関係の注入は、制御原理の反転の一形式であるソフトウェア エンジニアリング手法です。これにより、依存関係管理の負担がクライアント コードから依存するライブラリまたはサービスに移されます。
リポジトリをサービスに挿入するには、次の手順に従います。
- サービス ファイルで、typeorm から Repository をインポートし、@nestjs/typeorm から InjectRepository デコレータをインポートします。リポジトリに挿入するエンティティもインポートします。
- サービス クラスでコンストラクターを作成します。
- コンストラクター内のパラメーターとしてプライベート変数 repo を宣言して初期化します。
- エンティティのジェネリック タイプを使用してリポジトリのタイプをリポジトリに割り当てます。
- InjectRepository デコレータでリポジトリに注釈を付け、エンティティを引数として渡します。
// test.service.ts
import { Injectable } from '@nestjs/common';
import { Repository } from 'typeorm';
import { InjectRepository } from '@nestjs/typeorm';
import { Test } from './test.entity';
@Injectable()
export class TestService {
constructor(
@InjectRepository(Test)
private repo: Repository<Test>,
) {}
}
セットアップが完了したので、SQL クエリを実行してデータを取得または変更できます。
TypeORM を使用した SQL クエリの作成
サービス クラス内の repo 変数で TypeORM のリポジトリ メソッドを呼び出すことで、簡単な SQL クエリを作成できます。 TypeORM のクエリ ビルダーを使用して、複雑な SQL クエリを作成することもできます。