node-mysql2 で TiDB に接続する
TiDB は MySQL 互換のデータベースであり、 ノード-mysql2 Node.js 用の高速なmysqljs/mysql互換 MySQL ドライバーです。
このチュートリアルでは、TiDB と node-mysql2 を使用して次のタスクを実行する方法を学習します。
- 環境を設定します。
- node-mysql2 を使用して 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-mysql2-quickstart.git
cd tidb-nodejs-mysql2-quickstart
ステップ2: 依存関係をインストールする
次のコマンドを実行して、サンプル アプリに必要なパッケージ ( mysql2
とdotenv
を含む) をインストールします。
npm install
既存のプロジェクトに依存関係をインストールする
既存のプロジェクトの場合は、次のコマンドを実行してパッケージをインストールします。
npm install mysql2 dotenv --save
ステップ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 に接続する場合は、TLS 接続を有効にすることをお勧めします。
TLS 接続を有効にするには、
TIDB_ENABLE_SSL
からtrue
変更し、TIDB_CA_PATH
を使用して接続ダイアログからダウンロードした CA 証明書のファイル パスを指定します。.env
ファイルを保存します。
次のコマンドを実行して
.env.example
コピーし、名前を.env
に変更します。cp .env.example .env.env
ファイルを編集し、環境変数を次のように設定し、接続ダイアログで対応するプレースホルダー{}
接続パラメータに置き換えます。TIDB_HOST={host} TIDB_PORT=4000 TIDB_USER=root TIDB_PASSWORD={password} TIDB_DATABASE=testTiDB をローカルで実行している場合、デフォルトのホスト アドレスは
127.0.0.1
で、パスワードは空です。.env
ファイルを保存します。
ステップ4: コードを実行して結果を確認する
サンプル コードを実行するには、次のコマンドを実行します。
npm start
接続が成功すると、コンソールに次のように TiDB クラスターのバージョンが出力されます。
🔌 Connected to TiDB cluster! (TiDB version: 8.0.11-TiDB-v8.1.1)
⏳ Loading sample game data...
✅ Loaded sample game data.
🆕 Created a new player with ID 12.
ℹ️ Got Player 12: Player { id: 12, coins: 100, goods: 100 }
🔢 Added 50 coins and 50 goods to player 12, updated 1 row.
🚮 Deleted 1 player data.
サンプルコードスニペット
次のサンプル コード スニペットを参照して、独自のアプリケーション開発を完了することができます。
完全なサンプル コードとその実行方法については、 tidb-サンプル/tidb-nodejs-mysql2-クイックスタートリポジトリを参照してください。
接続オプションで接続する
次のコードは、環境変数で定義されたオプションを使用して TiDB への接続を確立します。
// Step 1. Import the 'mysql' and 'dotenv' packages.
import { createConnection } from "mysql2/promise";
import dotenv from "dotenv";
import * as fs from "fs";
// Step 2. Load environment variables from .env file to process.env.
dotenv.config();
async function main() {
// Step 3. Create a connection to the TiDB cluster.
const options = {
host: process.env.TIDB_HOST || '127.0.0.1',
port: process.env.TIDB_PORT || 4000,
user: 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,
}
const conn = await createConnection(options);
// Step 4. Perform some SQL operations...
// Step 5. Close the connection.
await conn.end();
}
void main();
注記
TiDB Cloud Serverless の場合、パブリック エンドポイントを使用するときは、
TIDB_ENABLE_SSL
経由で TLS 接続を有効にする必要があります。ただし、Node.js はデフォルトで組み込みのMozilla CA 証明書使用し、これはTiDB Cloud Serverless によって信頼されているため、TIDB_CA_PATH
経由で SSL CA 証明書を指定する必要はありません。
データを挿入
次のクエリは、単一のPlayer
レコードを作成し、 ResultSetHeader
オブジェクトを返します。
const [rsh] = await conn.query('INSERT INTO players (coins, goods) VALUES (?, ?);', [100, 100]);
console.log(rsh.insertId);
詳細についてはデータを挿入を参照してください。
クエリデータ
次のクエリは、 ID 1
の単一のPlayer
レコードを返します。
const [rows] = await conn.query('SELECT id, coins, goods FROM players WHERE id = ?;', [1]);
console.log(rows[0]);
詳細についてはクエリデータを参照してください。
データの更新
次のクエリは、 ID 1
のPlayer
にコイン50
枚と商品50
を追加します。
const [rsh] = await conn.query(
'UPDATE players SET coins = coins + ?, goods = goods + ? WHERE id = ?;',
[50, 50, 1]
);
console.log(rsh.affectedRows);
詳細についてはデータの更新を参照してください。
データを削除する
次のクエリは、ID 1
のPlayer
のレコードを削除します。
const [rsh] = await conn.query('DELETE FROM players WHERE id = ?;', [1]);
console.log(rsh.affectedRows);
詳細についてはデータを削除するを参照してください。
役に立つメモ
- 接続プール使用してデータベース接続を管理すると、接続の確立と破棄を頻繁に行うことによって発生するパフォーマンスのオーバーヘッドを削減できます。
- SQL インジェクションを回避するには、 準備されたステートメント使用することをお勧めします。
- 複雑な SQL ステートメントがあまり含まれないシナリオでは、 続編 、 タイプORM 、 プリズマなどの ORM フレームワークを使用すると、開発効率が大幅に向上します。
- データベース内の大きな数値 (
BIGINT
とDECIMAL
列) を処理する場合は、supportBigNumbers: true
オプションを有効にすることをお勧めします。 - ネットワークの問題によるソケット エラー
read ECONNRESET
回避するには、オプションenableKeepAlive: true
を有効にすることをお勧めします。(関連する問題: sidorares/node-mysql2#683 )
次のステップ
- node-mysql2 のドキュメントから node-mysql2 ドライバーの使用方法について詳しく学びます。
- 開発者ガイドのデータを挿入 、 データの更新 、 データを削除する 、 クエリデータ 、 取引 、 SQLパフォーマンスの最適化などの章で、 TiDB アプリケーション開発のベスト プラクティスを学習します。
- プロフェッショナルTiDB 開発者コースを通じて学び、試験に合格するとTiDB 認定獲得します。
ヘルプが必要ですか?
不和またはスラック 、またはサポートチケットを送信するについてコミュニティに質問してください。