TypeORM で TiDB に接続する
TiDB は MySQL 互換のデータベースであり、 タイプORM Node.js 用の人気のあるオープンソース ORM フレームワークです。
このチュートリアルでは、TiDB と TypeORM を使用して次のタスクを実行する方法を学習します。
- 環境を設定します。
- TypeORM を使用して TiDB クラスターに接続します。
- アプリケーションをビルドして実行します。オプションで、基本的な CRUD 操作用のサンプルコードスニペット見つけることができます。
注記
このチュートリアルは、 TiDB Cloud Serverless、 TiDB Cloud Dedicated、および TiDB Self-Managed で機能します。
前提条件
このチュートリアルを完了するには、次のものが必要です。
TiDB クラスターがない場合は、次のように作成できます。
- (推奨) TiDB Cloud Serverless クラスターの作成に従って、独自のTiDB Cloudクラスターを作成します。
- ローカルテストTiDBクラスタをデプロイまたは本番のTiDBクラスタをデプロイに従ってローカル クラスターを作成します。
サンプルアプリを実行してTiDBに接続する
このセクションでは、サンプル アプリケーション コードを実行して TiDB に接続する方法を示します。
ステップ1: サンプルアプリのリポジトリをクローンする
サンプル コード リポジトリを複製するには、ターミナル ウィンドウで次のコマンドを実行します。
git clone https://github.com/tidb-samples/tidb-nodejs-typeorm-quickstart.git
cd tidb-nodejs-typeorm-quickstart
ステップ2: 依存関係をインストールする
次のコマンドを実行して、サンプル アプリに必要なパッケージ ( typeorm
とmysql2
を含む) をインストールします。
npm install
既存のプロジェクトに依存関係をインストールする
既存のプロジェクトの場合は、次のコマンドを実行してパッケージをインストールします。
typeorm
: Node.js 用の ORM フレームワーク。mysql2
: Node.js 用の MySQL ドライバー。2mysql
も使用できます。dotenv
:.env
ファイルから環境変数を読み込みます。typescript
: TypeScript コードを JavaScript にコンパイルします。ts-node
: コンパイルせずに TypeScript コードを直接実行します。@types/node
: Node.js 用の TypeScript 型定義を提供します。
npm install typeorm mysql2 dotenv --save
npm install @types/node ts-node typescript --save-dev
ステップ3: 接続情報を構成する
選択した TiDB デプロイメント オプションに応じて、TiDB クラスターに接続します。
- TiDB Cloud Serverless
- TiDB Cloud Dedicated
- TiDB Self-Managed
クラスターページに移動し、ターゲット クラスターの名前をクリックして概要ページに移動します。
右上隅の「接続」をクリックします。接続ダイアログが表示されます。
接続ダイアログの構成が動作環境と一致していることを確認します。
- 接続タイプは
Public
に設定されています。 - ブランチは
main
に設定されています。 - Connect With は
General
に設定されています。 - オペレーティング システムは、アプリケーションを実行するオペレーティング システムと一致します。
- 接続タイプは
まだパスワードを設定していない場合は、「パスワードの生成」をクリックしてランダムなパスワードを生成します。
次のコマンドを実行して
.env.example
コピーし、名前を.env
に変更します。cp .env.example .env.env
ファイルを編集し、環境変数を次のように設定し、接続ダイアログで対応するプレースホルダー{}
接続パラメータに置き換えます。TIDB_HOST={host} TIDB_PORT=4000 TIDB_USER={user} TIDB_PASSWORD={password} TIDB_DATABASE=test TIDB_ENABLE_SSL=true注記
TiDB Cloud Serverless の場合、パブリック エンドポイントを使用するときは、
TIDB_ENABLE_SSL
経由で TLS 接続を有効にする必要があります。.env
ファイルを保存します。
クラスターページに移動し、ターゲット クラスターの名前をクリックして概要ページに移動します。
右上隅の「接続」をクリックします。接続ダイアログが表示されます。
接続ダイアログで、 [接続タイプ]ドロップダウン リストから[パブリック]を選択し、 [CA 証明書]をクリックして CA 証明書をダウンロードします。
IP アクセス リストを設定していない場合は、 「IP アクセス リストの設定」をクリックするか、手順IPアクセスリストを構成するに従って最初の接続の前に設定してください。
パブリック接続タイプに加えて、TiDB Dedicated はプライベートエンドポイントとVPC ピアリング接続タイプもサポートしています。詳細については、 TiDB専用クラスタに接続する参照してください。
次のコマンドを実行して
.env.example
コピーし、名前を.env
に変更します。cp .env.example .env.env
ファイルを編集し、環境変数を次のように設定し、接続ダイアログで対応するプレースホルダー{}
接続パラメータに置き換えます。TIDB_HOST={host} TIDB_PORT=4000 TIDB_USER={user} TIDB_PASSWORD={password} TIDB_DATABASE=test TIDB_ENABLE_SSL=true TIDB_CA_PATH={downloaded_ssl_ca_path}注記
TiDB Cloud Dedicated の場合、パブリックエンドポイントを使用する場合は、
TIDB_ENABLE_SSL
経由で TLS 接続を有効にすることをお勧めします。TIDB_ENABLE_SSL=true
設定する場合は、TIDB_CA_PATH=/path/to/ca.pem
経由で接続ダイアログからダウンロードした CA 証明書のパスを指定する必要があります。.env
ファイルを保存します。
次のコマンドを実行して
.env.example
コピーし、名前を.env
に変更します。cp .env.example .env.env
ファイルを編集し、環境変数を次のように設定し、対応するプレースホルダー{}
TiDB クラスターの接続パラメータに置き換えます。TIDB_HOST={host} TIDB_PORT=4000 TIDB_USER=root TIDB_PASSWORD={password} TIDB_DATABASE=testTiDB をローカルで実行している場合、デフォルトのホスト アドレスは
127.0.0.1
で、パスワードは空です。.env
ファイルを保存します。
ステップ4: データベーススキーマを初期化する
次のコマンドを実行して TypeORM CLI を起動し、 src/migrations
フォルダー内の移行ファイルに記述された SQL ステートメントを使用してデータベースを初期化します。
npm run migration:run
期待される実行出力
次の SQL ステートメントは、テーブルplayers
とテーブルprofiles
を作成し、2 つのテーブルは外部キーを通じて関連付けられます。
query: SELECT VERSION() AS `version`
query: SELECT * FROM `INFORMATION_SCHEMA`.`COLUMNS` WHERE `TABLE_SCHEMA` = 'test' AND `TABLE_NAME` = 'migrations'
query: CREATE TABLE `migrations` (`id` int NOT NULL AUTO_INCREMENT, `timestamp` bigint NOT NULL, `name` varchar(255) NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB
query: SELECT * FROM `test`.`migrations` `migrations` ORDER BY `id` DESC
0 migrations are already loaded in the database.
1 migrations were found in the source code.
1 migrations are new migrations must be executed.
query: START TRANSACTION
query: CREATE TABLE `profiles` (`player_id` int NOT NULL, `biography` text NOT NULL, PRIMARY KEY (`player_id`)) ENGINE=InnoDB
query: CREATE TABLE `players` (`id` int NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL, `coins` decimal NOT NULL, `goods` int NOT NULL, `created_at` datetime NOT NULL, `profilePlayerId` int NULL, UNIQUE INDEX `uk_players_on_name` (`name`), UNIQUE INDEX `REL_b9666644b90ccc5065993425ef` (`profilePlayerId`), PRIMARY KEY (`id`)) ENGINE=InnoDB
query: ALTER TABLE `players` ADD CONSTRAINT `fk_profiles_on_player_id` FOREIGN KEY (`profilePlayerId`) REFERENCES `profiles`(`player_id`) ON DELETE NO ACTION ON UPDATE NO ACTION
query: INSERT INTO `test`.`migrations`(`timestamp`, `name`) VALUES (?, ?) -- PARAMETERS: [1693814724825,"Init1693814724825"]
Migration Init1693814724825 has been executed successfully.
query: COMMIT
移行ファイルは、 src/entities
フォルダーで定義されたエンティティから生成されます。TypeORM でエンティティを定義する方法については、 タイプORM: エンティティを参照してください。
ステップ5: コードを実行して結果を確認する
サンプル コードを実行するには、次のコマンドを実行します。
npm start
予想される実行出力:
接続が成功すると、ターミナルは次のように TiDB クラスターのバージョンを出力します。
🔌 Connected to TiDB cluster! (TiDB version: 8.0.11-TiDB-v8.1.2)
🆕 Created a new player with ID 2.
ℹ️ Got Player 2: Player { id: 2, coins: 100, goods: 100 }
🔢 Added 50 coins and 50 goods to player 2, now player 2 has 100 coins and 150 goods.
🚮 Deleted 1 player data.
サンプルコードスニペット
次のサンプル コード スニペットを参照して、独自のアプリケーション開発を完了することができます。
完全なサンプル コードとその実行方法については、 tidb-samples/tidb-nodejs-typeorm-クイックスタートリポジトリを参照してください。
接続オプションで接続する
次のコードは、環境変数で定義されたオプションを使用して TiDB への接続を確立します。
// src/dataSource.ts
// Load environment variables from .env file to process.env.
require('dotenv').config();
export const AppDataSource = new DataSource({
type: "mysql",
host: process.env.TIDB_HOST || '127.0.0.1',
port: process.env.TIDB_PORT ? Number(process.env.TIDB_PORT) : 4000,
username: process.env.TIDB_USER || 'root',
password: process.env.TIDB_PASSWORD || '',
database: process.env.TIDB_DATABASE || 'test',
ssl: process.env.TIDB_ENABLE_SSL === 'true' ? {
minVersion: 'TLSv1.2',
ca: process.env.TIDB_CA_PATH ? fs.readFileSync(process.env.TIDB_CA_PATH) : undefined
} : null,
synchronize: process.env.NODE_ENV === 'development',
logging: false,
entities: [Player, Profile],
migrations: [__dirname + "/migrations/**/*{.ts,.js}"],
});
注記
TiDB Cloud Serverless の場合、パブリックエンドポイントを使用するときは TLS 接続を有効にする必要があります。このサンプルコードでは、
.env
ファイルの環境変数TIDB_ENABLE_SSL
true
に設定してください。ただし、Node.js はデフォルトで組み込みのMozilla CA 証明書使用し、これはTiDB Cloud Serverless によって信頼されているため、
TIDB_CA_PATH
で SSL CA 証明書を指定する必要はありません。
データを挿入
次のクエリは、単一のPlayer
レコードを作成し、TiDB によって生成されたid
フィールドを含む作成されたPlayer
オブジェクトを返します。
const player = new Player('Alice', 100, 100);
await this.dataSource.manager.save(player);
詳細についてはデータを挿入を参照してください。
クエリデータ
次のクエリは、ID 101 の単一のオブジェクトPlayer
を返します。レコードが見つからない場合はnull
返します。
const player: Player | null = await this.dataSource.manager.findOneBy(Player, {
id: id
});
詳細についてはクエリデータを参照してください。
データの更新
次のクエリは、ID 101
の商品Player
に商品50
を追加します。
const player = await this.dataSource.manager.findOneBy(Player, {
id: 101
});
player.goods += 50;
await this.dataSource.manager.save(player);
詳細についてはデータの更新を参照してください。
データを削除する
次のクエリは、ID 101
のPlayer
削除します。
await this.dataSource.manager.delete(Player, {
id: 101
});
詳細についてはデータを削除するを参照してください。
生のSQLクエリを実行する
次のクエリは生のSQL文( SELECT VERSION() AS tidb_version;
)を実行し、TiDBクラスタのバージョンを返します。
const rows = await dataSource.query('SELECT VERSION() AS tidb_version;');
console.log(rows[0]['tidb_version']);
詳細についてはタイプORM: データソースAPIを参照してください。
役に立つメモ
外部キー制約
外部キー制約 (実験的) を使用すると、データベース側でチェックを追加することで、データの参照整合性保証されます。ただし、大量のデータを扱うシナリオでは、重大なパフォーマンスの問題が発生する可能性があります。
createForeignKeyConstraints
オプション (デフォルト値はtrue
) を使用して、エンティティ間のリレーションシップを構築するときに外部キー制約を作成するかどうかを制御できます。
@Entity()
export class ActionLog {
@PrimaryColumn()
id: number
@ManyToOne((type) => Person, {
createForeignKeyConstraints: false,
})
person: Person
}
詳細については、 TypeORMFAQおよび外部キー制約を参照してください。
次のステップ
- TypeORM の詳しい使い方については、 TypeORMのドキュメントをご覧ください。
- 開発者ガイドのデータを挿入 、 データの更新 、 データを削除する 、 クエリデータ 、 取引 、 SQLパフォーマンスの最適化などの章で、 TiDB アプリケーション開発のベスト プラクティスを学習します。
- プロフェッショナルTiDB 開発者コースを通じて学び、試験に合格するとTiDB 認定獲得します。
ヘルプが必要ですか?
不和またはスラック 、またはサポートチケットを送信するについてコミュニティに質問してください。