Sequelize で TiDB に接続する

TiDB は MySQL 互換のデータベースであり、 続編 Node.js 用の人気のある ORM フレームワークです。

このチュートリアルでは、TiDB と Sequelize を使用して次のタスクを実行する方法を学習します。

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

注記

このチュートリアルは、 TiDB Cloud Serverless、 TiDB Cloud Dedicated、および TiDB Self-Managed で機能します。

前提条件

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

TiDB クラスターがない場合は、次のように作成できます。

サンプルアプリを実行してTiDBに接続する

このセクションでは、サンプル アプリケーション コードを実行して TiDB に接続する方法を示します。

注記

完全なコード スニペットと実行手順については、 tidb-samples/tidb-nodejs-sequelize-クイックスタート GitHub リポジトリを参照してください。

ステップ1: サンプルアプリのリポジトリをクローンする

サンプル コード リポジトリを複製するには、ターミナル ウィンドウで次のコマンドを実行します。

git clone git@github.com:tidb-samples/tidb-nodejs-sequelize-quickstart.git cd tidb-nodejs-sequelize-quickstart

ステップ2: 依存関係をインストールする

次のコマンドを実行して、サンプル アプリに必要なパッケージ ( sequelizeを含む) をインストールします。

npm install

ステップ3: 接続情報を構成する

選択した TiDB デプロイメント オプションに応じて、TiDB クラスターに接続します。

  • TiDB Cloud Serverless
  • TiDB Cloud Dedicated
  • TiDB Self-Managed
  1. クラスターページに移動し、ターゲット クラスターの名前をクリックして概要ページに移動します。

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

  3. 接続ダイアログの構成が動作環境と一致していることを確認します。

    • 接続タイプPublicに設定されています

    • ブランチはmainに設定されています

    • 接続先はGeneralに設定されています

    • オペレーティング システムは環境に適合します。

    注記

    Node.js アプリケーションでは、TLS (SSL) 接続を確立するときに Node.js がデフォルトで組み込みのMozilla CA 証明書使用するため、SSL CA 証明書を提供する必要はありません。

  4. ランダムなパスワードを作成するには、 「パスワードの生成」をクリックします。

    ヒント

    以前にパスワードを生成したことがある場合は、元のパスワードを使用するか、 「パスワードのリセット」をクリックして新しいパスワードを生成することができます。

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

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

    TIDB_HOST='{host}' TIDB_PORT='4000' TIDB_USER='{user}' TIDB_PASSWORD='{password}' TIDB_DB_NAME='test' TIDB_ENABLE_SSL='true'
  7. .envファイルを保存します。

  1. クラスターページに移動し、ターゲット クラスターの名前をクリックして概要ページに移動します。

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

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

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

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

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

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

    TIDB_HOST='{host}' TIDB_PORT='4000' TIDB_USER='{user}' TIDB_PASSWORD='{password}' TIDB_DB_NAME='test' TIDB_ENABLE_SSL='true' TIDB_CA_PATH='{path/to/ca}'
  6. .envファイルを保存します。

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

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

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

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

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

ステップ4: サンプルアプリを実行する

サンプル コードを実行するには、次のコマンドを実行します。

npm start
**予想される出力(一部):**
INFO (app/10117): Getting sequelize instance... Executing (default): SELECT 1+1 AS result Executing (default): DROP TABLE IF EXISTS `players`; Executing (default): CREATE TABLE IF NOT EXISTS `players` (`id` INTEGER NOT NULL auto_increment COMMENT 'The unique ID of the player.', `coins` INTEGER NOT NULL COMMENT 'The number of coins that the player had.', `goods` INTEGER NOT NULL COMMENT 'The number of goods that the player had.', `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB; Executing (default): SHOW INDEX FROM `players` Executing (default): INSERT INTO `players` (`id`,`coins`,`goods`,`createdAt`,`updatedAt`) VALUES (1,100,100,'2023-08-31 09:10:11','2023-08-31 09:10:11'),(2,200,200,'2023-08-31 09:10:11','2023-08-31 09:10:11'),(3,300,300,'2023-08-31 09:10:11','2023-08-31 09:10:11'),(4,400,400,'2023-08-31 09:10:11','2023-08-31 09:10:11'),(5,500,500,'2023-08-31 09:10:11','2023-08-31 09:10:11'); Executing (default): SELECT `id`, `coins`, `goods`, `createdAt`, `updatedAt` FROM `players` AS `players` WHERE `players`.`coins` > 300; Executing (default): UPDATE `players` SET `coins`=?,`goods`=?,`updatedAt`=? WHERE `id` = ? Executing (default): DELETE FROM `players` WHERE `id` = 6

サンプルコードスニペット

次のサンプル コード スニペットを参照して、独自のアプリケーション開発を完了することができます。

完全なサンプル コードとその実行方法については、 tidb-samples/tidb-nodejs-sequelize-クイックスタートリポジトリを参照してください。

TiDBに接続する

次のコードは、環境変数で定義されたオプションを使用して TiDB への接続を確立します。

// src/lib/tidb.ts import { Sequelize } from 'sequelize'; export function initSequelize() { return new Sequelize({ dialect: 'mysql', host: process.env.TIDB_HOST || 'localhost', // TiDB host, for example: {gateway-region}.aws.tidbcloud.com port: Number(process.env.TIDB_PORT) || 4000, // TiDB port, default: 4000 username: process.env.TIDB_USER || 'root', // TiDB user, for example: {prefix}.root password: process.env.TIDB_PASSWORD || 'root', // TiDB password database: process.env.TIDB_DB_NAME || 'test', // TiDB database name, default: test dialectOptions: { ssl: process.env?.TIDB_ENABLE_SSL === 'true' // (Optional) Enable SSL ? { minVersion: 'TLSv1.2', rejectUnauthorized: true, ca: process.env.TIDB_CA_PATH // (Optional) Path to the custom CA certificate ? readFileSync(process.env.TIDB_CA_PATH) : undefined, } : null, }, } export async function getSequelize() { if (!sequelize) { sequelize = initSequelize(); try { await sequelize.authenticate(); logger.info('Connection has been established successfully.'); } catch (error) { logger.error('Unable to connect to the database:'); logger.error(error); throw error; } } return sequelize; }

データを挿入

次のクエリは、単一のPlayersレコードを作成し、 Playersオブジェクトを返します。

logger.info('Creating a new player...'); const newPlayer = await playersModel.create({ id: 6, coins: 600, goods: 600, }); logger.info('Created a new player.'); logger.info(newPlayer.toJSON());

詳細についてはデータを挿入を参照してください。

クエリデータ

次のクエリは、コインが300より大きい単一のPlayersレコードを返します。

logger.info('Reading all players with coins > 300...'); const allPlayersWithCoinsGreaterThan300 = await playersModel.findAll({ where: { coins: { [Op.gt]: 300, }, }, }); logger.info('Read all players with coins > 300.'); logger.info(allPlayersWithCoinsGreaterThan300.map((p) => p.toJSON()));

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

データの更新

次のクエリは、セクションデータを挿入で作成された ID 6Playersにコイン700と商品700を設定します。

logger.info('Updating the new player...'); await newPlayer.update({ coins: 700, goods: 700 }); logger.info('Updated the new player.'); logger.info(newPlayer.toJSON());

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

データを削除する

次のクエリは、セクションデータを挿入で作成された ID 6Playerレコードを削除します。

logger.info('Deleting the new player...'); await newPlayer.destroy(); const deletedNewPlayer = await playersModel.findByPk(6); logger.info('Deleted the new player.'); logger.info(deletedNewPlayer?.toJSON());

詳細についてはデータを削除するを参照してください。

次のステップ

ヘルプが必要ですか?

不和またはスラック 、またはサポートチケットを送信するについてコミュニティに質問してください。

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