Sequelizeを使用してTiDBに接続する
TiDB は MySQL 互換データベースであり、シークエライズは Node.js の人気のある ORM フレームワークです。
このチュートリアルでは、TiDBとSequelizeを使用して以下のタスクを実行する方法を学ぶことができます。
- 環境をセットアップしてください。
- Sequelizeを使用してTiDBに接続します。
- アプリケーションをビルドして実行します。オプションで、基本的な CRUD 操作用のサンプルコードスニペットを見つけることができます。
注記
このチュートリアルは、 TiDB Cloud Starter、 TiDB Cloud Essential、 TiDB Cloud Premium、 TiDB Cloud Dedicated、およびTiDB Self-Managedに対応しています。
前提条件
このチュートリアルを完了するには、以下が必要です。
- Node.js 18以降。
- Git 。
- TiDBクラスタ。
TiDBクラスタをお持ちでない場合は、以下の手順で作成できます。
TiDBに接続するには、サンプルアプリを実行してください。
このセクションでは、サンプルアプリケーションコードを実行してTiDBに接続する方法を説明します。
注記
完全なコードスニペットと実行手順については、 tidb-samples/tidb-nodejs-sequelize-quickstart 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ページに移動し、対象のTiDB Cloud StarterまたはEssentialインスタンスの名前をクリックして、概要ページに移動します。
右上隅の「接続」をクリックしてください。接続ダイアログが表示されます。
接続ダイアログの設定がご使用のオペレーティング環境と一致していることを確認してください。
接続タイプは
Publicに設定されています。ブランチは
mainに設定されています。Connect With は
Generalに設定されています。お使いの環境に合ったオペレーティングシステムを選択してください。
注記
Node.jsアプリケーションでは、SSL CA証明書を提供する必要はありません。Node.jsはTLS(SSL)接続を確立する際に、デフォルトで組み込みのMozilla CA証明書を使用するためです。
「パスワードを生成」をクリックすると、ランダムなパスワードが生成されます。
ヒント
以前にパスワードを作成したことがある場合は、元のパスワードを使用するか、 「パスワードをリセット」をクリックして新しいパスワードを作成できます。
.env.exampleをコピーして.envに名前を変更するには、次のコマンドを実行します。cp .env.example .env.envファイルを編集し、環境変数を以下のように設定し、接続ダイアログ上の対応するプレースホルダー{}接続パラメータに置き換えます。TIDB_HOST='{host}' TIDB_PORT='4000' TIDB_USER='{user}' TIDB_PASSWORD='{password}' TIDB_DB_NAME='test' TIDB_ENABLE_SSL='true'.envファイルを保存します。
私のTiDBページに移動し、対象のTiDB Cloud Premiumインスタンスの名前をクリックして概要ページに移動します。
左側のナビゲーションペインで、 [設定] > [ネットワーク]をクリックします。
ネットワークのページで、 [パブリックエンドポイント**を有効にする]をクリックし、次に[IP アドレスの追加]**をクリックします。
クライアントのIPアドレスがアクセスリストに追加されていることを確認してください。
左側のナビゲーションペインで「概要」をクリックすると、インスタンスの概要ページに戻ります。
右上隅の「接続」をクリックしてください。接続ダイアログが表示されます。
接続ダイアログで、 「接続タイプ」ドロップダウンリストから「パブリック」を選択します。
- 公開エンドポイントがまだ有効化中であることを示すメッセージが表示された場合は、処理が完了するまでお待ちください。
- まだパスワードを設定していない場合は、ダイアログの「ルートパスワードを設定」をクリックしてください。
- サーバー証明書を確認する必要がある場合、または接続に失敗して認証局(CA)証明書が必要な場合は、 「CA証明書」をクリックしてダウンロードしてください。
- パブリック接続タイプに加えて、 TiDB Cloud Premium はプライベート エンドポイント接続をサポートします。詳細については、 AWS PrivateLink経由でTiDB Cloud Premiumに接続します。を参照してください。
.env.exampleをコピーして.envに名前を変更するには、次のコマンドを実行します。cp .env.example .env.envファイルを編集し、環境変数を以下のように設定し、接続ダイアログで対応するプレースホルダー{}を接続パラメータに置き換えます。TIDB_HOST='{host}' TIDB_PORT='4000' TIDB_USER='{user}' TIDB_PASSWORD='{password}' TIDB_DB_NAME='test' TIDB_ENABLE_SSL='false'.envファイルを保存します。
私のTiDBページに移動し、対象のTiDB Cloud Dedicatedクラスタの名前をクリックして概要ページに移動します。
右上隅の「接続」をクリックしてください。接続ダイアログが表示されます。
接続ダイアログで、「接続タイプ」ドロップダウンリストから「パブリック」を選択し、 「CA証明書」をクリックしてCA証明書をダウンロードします。
IP アクセス リストを設定していない場合は、最初の接続の前に、 [IP アクセス リストの設定] をクリックするか、「IP アクセス リストを設定する」の手順に従ってIPアクセスリストを設定する。
TiDB Cloud Dedicated は、パブリック接続タイプに加えて、プライベート エンドポイントおよびVPC ピアリング接続タイプもサポートしています。詳細については、 TiDB Cloud Dedicatedクラスタに接続します参照してください。
.env.exampleをコピーして.envに名前を変更するには、次のコマンドを実行します。cp .env.example .env.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}'.envファイルを保存します。
.env.exampleをコピーして.envに名前を変更するには、次のコマンドを実行します。cp .env.example .env.envファイルを編集し、環境変数を以下のように設定し、接続ダイアログ上の対応するプレースホルダー{}接続パラメータに置き換えます。TIDB_HOST='{host}' TIDB_PORT='4000' TIDB_USER='root' TIDB_PASSWORD='{password}' TIDB_DB_NAME='test'TiDBをローカルで実行している場合、デフォルトのホストアドレスは
127.0.0.1で、パスワードは空です。.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-quickstartリポジトリを参照してください。
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());
詳細については、データを挿入するを参照してください。
クエリデータ
次のクエリはPlayersより大きいコインの単一の300レコードを返します。
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 700を持つ700 Playersコインと6商品をデータを挿入するセクション:
logger.info('Updating the new player...');
await newPlayer.update({ coins: 700, goods: 700 });
logger.info('Updated the new player.');
logger.info(newPlayer.toJSON());
詳細については、データの更新を参照してください。
データを削除する
次のクエリは、データを挿入データを挿入するで作成された ID { Playerの6レコードを削除します。
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());
詳細については、データを削除するを参照してください。
次のステップ
- ORM フレームワーク Sequelize ドライバーの使用法の詳細についてはSequelizeのドキュメント参照してください。
- 開発者ガイドデータを挿入する」、データの更新データを削除する、「SQL パフォーマンス最適化」など単一テーブルの読み取り章を読んで、TiDB アプリケーション開発のベスト 取引SQLパフォーマンス最適化。
- プロフェッショナルなTiDB開発者向けコースコースを通じて学習し、試験に合格するとTiDB認定資格を取得します。
お困りですか?
- 不和or スラックコミュニティに質問してください。
- TiDB Cloudのサポートチケットを送信してください
- TiDB Self-Managedのサポートチケットを送信してください