mysql.js を使用して TiDB に接続する
TiDB は MySQL 互換データベースであり、 mysql.jsドライバーは MySQL プロトコルを実装する純粋な Node.js JavaScript クライアントです。
このチュートリアルでは、TiDB と mysql.js ドライバーを使用して次のタスクを実行する方法を学習できます。
- 環境をセットアップします。
- mysql.js ドライバーを使用して TiDB クラスターに接続します。
- アプリケーションをビルドして実行します。オプションで、基本的な CRUD 操作のサンプルコードスニペットを見つけることができます。
注記:
このチュートリアルは、TiDB サーバーレス、TiDB 専用、および TiDB セルフホストで動作します。
前提条件
このチュートリアルを完了するには、次のものが必要です。
TiDB クラスターがない場合は、次のように作成できます。
- (推奨) TiDB サーバーレスクラスターの作成に従って、独自のTiDB Cloudクラスターを作成します。
- ローカル テスト TiDB クラスターをデプロイまたは本番TiDB クラスターをデプロイに従ってローカル クラスターを作成します。
- (推奨) TiDB サーバーレスクラスターの作成に従って、独自のTiDB Cloudクラスターを作成します。
- ローカル テスト TiDB クラスターをデプロイまたは本番TiDB クラスターをデプロイに従ってローカル クラスターを作成します。
サンプル アプリを実行して TiDB に接続する
このセクションでは、サンプル アプリケーション コードを実行して TiDB に接続する方法を説明します。
ステップ 1: サンプル アプリ リポジトリのクローンを作成する
ターミナル ウィンドウで次のコマンドを実行して、サンプル コード リポジトリのクローンを作成します。
git clone https://github.com/tidb-samples/tidb-nodejs-mysqljs-quickstart.git
cd tidb-nodejs-mysqljs-quickstart
ステップ 2: 依存関係をインストールする
次のコマンドを実行して、サンプル アプリに必要なパッケージ ( mysql
とdotenv
を含む) をインストールします。
npm install
依存関係を既存のプロジェクトにインストールする
既存のプロジェクトの場合、次のコマンドを実行してパッケージをインストールします。
npm install mysql dotenv --save
ステップ 3: 接続情報を構成する
選択した TiDB デプロイメント オプションに応じて、TiDB クラスターに接続します。
- TiDB Serverless
- TiDB Dedicated
- TiDB Self-Hosted
クラスターページに移動し、ターゲット クラスターの名前をクリックして、その概要ページに移動します。
右上隅にある「接続」をクリックします。接続ダイアログが表示されます。
接続ダイアログの設定が動作環境と一致していることを確認してください。
- エンドポイント タイプは
Public
に設定されます。 - ブランチは
main
に設定されます。 - [接続先] は
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 サーバーレスの場合、パブリック エンドポイントを使用する場合は、TLS 接続を
TIDB_ENABLE_SSL
経由で有効にする必要があります。.env
ファイルを保存します。
クラスターページに移動し、ターゲット クラスターの名前をクリックして、その概要ページに移動します。
右上隅にある「接続」をクリックします。接続ダイアログが表示されます。
「どこからでもアクセスを許可」をクリックし、 「TiDB クラスター CA のダウンロード」をクリックして CA 証明書をダウンロードします。
接続文字列の取得方法の詳細については、 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 Dended に接続する場合は、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-v7.5.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-samples/tidb-nodejs-mysqljs-quickstartリポジトリを確認してください。
接続オプションを使用して接続する
次のコードは、環境変数で定義されたオプションを使用して TiDB への接続を確立します。
// Step 1. Import the 'mysql' and 'dotenv' packages.
import { createConnection } from "mysql";
import dotenv from "dotenv";
import * as fs from "fs";
// Step 2. Load environment variables from .env file to process.env.
dotenv.config();
// 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 = createConnection(options);
// Step 4. Perform some SQL operations...
// Step 5. Close the connection.
conn.end();
注記
TiDB サーバーレスの場合、パブリック エンドポイントを使用する場合は
TIDB_ENABLE_SSL
経由の TLS 接続を有効にする必要があります。ただし、Node.js はデフォルトで組み込みのMozilla CA 証明書を使用し、TiDB Serverless によって信頼されるため、TIDB_CA_PATH
経由で SSL CA 証明書を指定する必要はありません。
データの挿入
次のクエリは、単一のPlayer
レコードを作成し、新しく作成されたレコードの ID を返します。
conn.query('INSERT INTO players (coins, goods) VALUES (?, ?);', [100, 100], (err, ok) => {
if (err) {
console.error(err);
} else {
console.log(ok.insertId);
}
});
詳細については、 データの挿入を参照してください。
クエリデータ
次のクエリは、ID 1
による単一のPlayer
レコードを返します。
conn.query('SELECT id, coins, goods FROM players WHERE id = ?;', [1], (err, rows) => {
if (err) {
console.error(err);
} else {
console.log(rows[0]);
}
});
詳細については、 クエリデータを参照してください。
データを更新する
次のクエリは、ID 1
のPlayer
に50
コインと50
グッズを追加します。
conn.query(
'UPDATE players SET coins = coins + ?, goods = goods + ? WHERE id = ?;',
[50, 50, 1],
(err, ok) => {
if (err) {
console.error(err);
} else {
console.log(ok.affectedRows);
}
}
);
詳細については、 データを更新するを参照してください。
データの削除
次のクエリは、ID 1
のPlayer
レコードを削除します。
conn.query('DELETE FROM players WHERE id = ?;', [1], (err, ok) => {
if (err) {
reject(err);
} else {
resolve(ok.affectedRows);
}
});
詳細については、 データの削除を参照してください。
便利なメモ
接続プールを使用してデータベース接続を管理すると、接続の頻繁な確立と破棄によって生じるパフォーマンスのオーバーヘッドを軽減できます。
SQL インジェクション攻撃を回避するには、SQL を実行する前にクエリ値のエスケープを使用することをお勧めします。
注記
mysqljs/mysql
パッケージはまだプリペアド ステートメントをサポートしておらず、クライアント側で値をエスケープするだけです (関連問題: mysqljs/mysql#274 )。この機能を使用して SQL インジェクションを回避したり、バッチ挿入/更新の効率を向上させたい場合は、代わりにmysql2パッケージを使用することをお勧めします。
ORM フレームワークを使用すると、 続編 、 TypeORM 、 プリズマなどの多数の複雑な SQL ステートメントを使用しないシナリオでの開発効率が向上します。
データベースで大きな数値 (
BIGINT
とDECIMAL
列) を扱う場合は、supportBigNumbers: true
オプションを有効にすることをお勧めします。
次のステップ
- mysql.js ドライバーの使用法についてはmysql.js のドキュメントからご覧ください。
- 開発者ガイドの章 ( データの挿入など) で TiDB トランザクション SQLパフォーマンスの最適化 データを更新するベスト プラクティスクエリデータ学習データの削除ます。
- プロフェッショナルとしてTiDB 開発者コースを学び、試験合格後にTiDB 認定獲得します。
助けが必要?
不和またはサポートチケットを作成するについて質問してください。
不和またはサポートチケットを作成するについて質問してください。