← 解説「データベース接続 — TypeOrmModule」に戻る
サンプルコードで身につける: データベース接続 — TypeOrmModule
解説で学んだ概念を、5つの具体例で確認します。素朴な例から実務寄りの例へと進みます。
1最小の forRoot 接続設定
TypeOrmModule.forRoot() に接続情報を直接書いた最小の例です。type で DB の種類、host や database で接続先を指定し、entities にこの DB で扱うクラスを並べるという骨格を最小単位で示します。
import { Module } from "@nestjs/common";
import { TypeOrmModule } from "@nestjs/typeorm";
import { User } from "./user.entity";
@Module({
imports: [
TypeOrmModule.forRoot({
type: "postgres", // DB の種類
host: "localhost",
port: 5432,
database: "app",
entities: [User], // この DB で扱うエンティティ
synchronize: true, // 開発初期のみ。本番では false
}),
],
})
export class AppModule {}
2接続情報を環境変数から組み立てる
host や password のような環境ごとに変わる値を process.env から読み込む実務寄りの形です。コードを書き換えずに開発・本番で接続先だけ切り替えられるようになり、秘密情報をソースに残さずに済みます。
import { Module } from "@nestjs/common";
import { TypeOrmModule } from "@nestjs/typeorm";
import { User } from "./user.entity";
@Module({
imports: [
TypeOrmModule.forRoot({
type: "postgres",
host: process.env.DB_HOST,
port: parseInt(process.env.DB_PORT ?? "5432", 10),
username: process.env.DB_USER,
password: process.env.DB_PASS, // .env から(Git に載せない)
database: process.env.DB_NAME,
entities: [User],
synchronize: false,
}),
],
})
export class AppModule {}
3synchronize の危険性をデータで再現
synchronize: true がエンティティ定義に合わせて DB を作り替える挙動を、既存テーブルと新エンティティの差分計算でプレーン TypeScript に再現した例です。列を削っただけで本番データが消えうるという危険が、生成される操作から具体的に分かります。
TypeScript
4接続プールの考え方
リクエストごとに DB 接続を開閉せず、あらかじめ作った接続を使い回す「接続プール」をプレーン TypeScript で再現した例です。extra の接続数上限が何を意味するのかと、上限を超えると待たされる挙動の感覚を掴みます。
TypeScript
5ConfigModule と連携した非同期設定
forRootAsync を使い、ConfigModule が読み込んだ環境変数から接続設定を組み立てる実務の定番形です。useFactory に ConfigService を注入することで、設定の読み込み完了を待ってから接続を初期化できます。
import { Module } from "@nestjs/common";
import { TypeOrmModule } from "@nestjs/typeorm";
import { ConfigModule, ConfigService } from "@nestjs/config";
import { User } from "./user.entity";
@Module({
imports: [
ConfigModule.forRoot({ isGlobal: true }),
TypeOrmModule.forRootAsync({
imports: [ConfigModule],
inject: [ConfigService], // useFactory に注入する
useFactory: (config: ConfigService) => ({
type: "postgres" as const,
url: config.get<string>("DATABASE_URL"),
entities: [User],
synchronize: config.get("NODE_ENV") !== "production",
}),
}),
],
})
export class AppModule {}