📣
TiDB Cloud Premium はパブリックプレビュー中です。エンタープライズワークロード向けの無制限のスケーリング、即時の弾力性、高度なセキュリティを提供します。このページは自動翻訳されたものです。原文はこちらからご覧ください。

TypeORMを使用してTiDBに接続する



TiDBはMySQL互換のデータベースであり、 TypeORMはNode.js向けの人気の高いオープンソースのORMフレームワークです。

このチュートリアルでは、TiDBとTypeORMを使用して以下のタスクを実行する方法を学ぶことができます。

  • 環境をセットアップしてください。
  • TypeORMを使用してTiDBに接続します。
  • アプリケーションをビルドして実行します。オプションで、基本的な CRUD 操作用のサンプルコードスニペットを見つけることができます。

注記

このチュートリアルは、 TiDB Cloud Starter、 TiDB Cloud Essential、 TiDB Cloud Premium、 TiDB Cloud Dedicated、およびTiDB Self-Managedに対応しています。

前提条件

このチュートリアルを完了するには、以下が必要です。

  • お使いのコンピューターにNode.js >= 16.xがインストールされていること。
  • お使いのマシンにGitがインストールされています。
  • 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 ドライバーですmysqlドライバーも使用できます。
  • 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に接続してください。

    1. 私のTiDBページに移動し、対象のTiDB Cloud StarterまたはEssentialインスタンスの名前をクリックして、概要ページに移動します。

    2. 右上隅の「接続」をクリックしてください。接続ダイアログが表示されます。

    3. 接続ダイアログの設定がご使用のオペレーティング環境と一致していることを確認してください。

      • 接続タイプPublicに設定されています。
      • ブランチmainに設定されています。
      • 「接続」はGeneralに設定されています。
      • オペレーティングシステムは、アプリケーションを実行するオペレーティングシステムと一致します。
    4. まだパスワードを設定していない場合は、 「パスワードを生成」をクリックしてランダムなパスワードを生成してください。

    5. .env.exampleをコピーして.envに名前を変更するには、次のコマンドを実行します。

      cp .env.example .env
    6. .envファイルを編集し、環境変数を以下のように設定し、接続ダイアログ上の対応するプレースホルダー{}接続パラメータに置き換えます。

      TIDB_HOST={host} TIDB_PORT=4000 TIDB_USER={user} TIDB_PASSWORD={password} TIDB_DATABASE=test TIDB_ENABLE_SSL=true

      注記

      TiDB Cloud StarterおよびTiDB Cloud Essentialの場合、パブリック エンドポイントを使用する際にはTIDB_ENABLE_SSLを介して TLS 接続を有効にする必要があります

    7. .envファイルを保存します。

    1. 私のTiDBページに移動し、対象のTiDB Cloud Premiumインスタンスの名前をクリックして概要ページに移動します。

    2. 左側のナビゲーションペインで、 [設定] > [ネットワーク]をクリックします。

    3. ネットワークのページで、 [パブリックエンドポイント**を有効にする]をクリックし、次に[IP アドレスの追加]**をクリックします。

      クライアントのIPアドレスがアクセスリストに追加されていることを確認してください。

    4. 左側のナビゲーションペインで「概要」をクリックすると、インスタンスの概要ページに戻ります。

    5. 右上隅の「接続」をクリックしてください。接続ダイアログが表示されます。

    6. 接続ダイアログで、 「接続タイプ」ドロップダウンリストから「パブリック」を選択します。

      • 公開エンドポイントがまだ有効化中であることを示すメッセージが表示された場合は、処理が完了するまでお待ちください。
      • まだパスワードを設定していない場合は、ダイアログの「ルートパスワードを設定」をクリックしてください。
      • サーバー証明書を確認する必要がある場合、または接続に失敗して認証局(CA)証明書が必要な場合は、 「CA証明書」をクリックしてダウンロードしてください。
      • パブリック接続タイプに加えて、 TiDB Cloud Premium はプライベート エンドポイント接続をサポートします。詳細については、 AWS PrivateLink経由でTiDB Cloud Premiumに接続します。を参照してください。
    7. .env.exampleをコピーして.envに名前を変更するには、次のコマンドを実行します。

      cp .env.example .env
    8. .envファイルを編集し、環境変数を以下のように設定し、接続ダイアログで対応するプレースホルダー{}を接続パラメータに置き換えます。

      TIDB_HOST={host} TIDB_PORT=4000 TIDB_USER={user} TIDB_PASSWORD={password} TIDB_DATABASE=test TIDB_ENABLE_SSL=false
    9. .envファイルを保存します。

    1. 私のTiDBページに移動し、対象のTiDB Cloud Dedicatedクラスタの名前をクリックして概要ページに移動します。

    2. 右上隅の「接続」をクリックしてください。接続ダイアログが表示されます。

    3. 接続ダイアログで、「接続タイプ」ドロップダウンリストから「パブリック」を選択し、 「CA証明書」をクリックしてCA証明書をダウンロードします。

      IP アクセス リストを設定していない場合は、最初の接続の前に、 [IP アクセス リストの設定] をクリックするか、「IP アクセス リストを設定する」の手順に従ってIPアクセスリストを設定する

      TiDB Cloud Dedicated は、パブリック接続タイプに加えて、プライベート エンドポイントおよびVPC ピアリング接続タイプもサポートしています。詳細については、 TiDB Cloud Dedicatedクラスタに接続します参照してください。

    4. .env.exampleをコピーして.envに名前を変更するには、次のコマンドを実行します。

      cp .env.example .env
    5. .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 証明書のパスを指定する必要があります

    6. .envファイルを保存します。

    1. .env.exampleをコピーして.envに名前を変更するには、次のコマンドを実行します。

      cp .env.example .env
    2. .envファイルを編集し、環境変数を以下のように設定し、対応するプレースホルダー{} TiDB の接続パラメータに置き換えてください。

      TIDB_HOST={host} TIDB_PORT=4000 TIDB_USER=root TIDB_PASSWORD={password} TIDB_DATABASE=test

      TiDBをローカルで実行している場合、デフォルトのホストアドレスは127.0.0.1で、パスワードは空です。

    3. .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 でエンティティを定義する方法については、 TypeORM: エンティティを参照してください。

    ステップ5:コードを実行して結果を確認する

    サンプルコードを実行するには、以下のコマンドを実行してください。

    npm start

    期待される実行出力:

    接続が成功すると、ターミナルには次のようにTiDBのバージョンが出力されます。

    🔌 Connected to TiDB cluster! (TiDB version: 8.0.11-TiDB-v8.5.4) 🆕 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-quickstartリポジトリを参照してください。

    接続オプションを使用して接続します

    以下のコードは、環境変数で定義されたオプションを使用して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 StarterおよびTiDB Cloud Essentialでは、パブリックエンドポイントを使用する際に TLS 接続を有効にする必要があります。このサンプルコードでは、 TIDB_ENABLE_SSL .env } をtrueに設定してください。

    ただし、Node.js はデフォルトで組み込みのMozilla CA証明書を使用するため、 TIDB_CA_PATHを介して SSL CA 証明書を指定する必要はありません。この証明書はTiDB Cloud StarterおよびTiDB Cloud Essentialによって信頼されています。

    データを挿入する

    次のクエリは、単一のPlayerレコードを作成し、TiDB によって生成されたPlayerフィールドを含む、作成されたidオブジェクトを返します。

    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 });

    詳細については、 クエリデータを参照してください。

    データの更新

    次のクエリは50の商品Player101を追加します。

    const player = await this.dataSource.manager.findOneBy(Player, { id: 101 }); player.goods += 50; await this.dataSource.manager.save(player);

    詳細については、データの更新を参照してください。

    データを削除する

    以下のクエリは、IDがPlayerである101 }を削除します。

    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']);

    詳細については、 TypeORM: データソースAPIを参照してください。

    役立つメモ

    外部キー制約

    外部キー制約を使用すると、データベース側でチェックを追加することでデータの参照整合性が保証されます。ただし、これにより、データ量が大きいシナリオでは重大なパフォーマンスの問題が発生する可能性があります。

    createForeignKeyConstraintsオプションを使用すると、エンティティ間のリレーションシップを構築する際に外部キー制約を作成するかどうかを制御できます (デフォルト値はtrueです)。

    @Entity() export class ActionLog { @PrimaryColumn() id: number @ManyToOne((type) => Person, { createForeignKeyConstraints: false, }) person: Person }

    詳細については、 TypeORMに関するFAQおよび外部キー制約を参照してください。

    次のステップ

    お困りですか?

    このページは役に立ちましたか?