Prismaを使用してTiDBに接続する
TiDB は MySQL 互換データベースであり、プリズマNode.js 用の人気のあるオープンソース ORM フレームワークです。
このチュートリアルでは、TiDBとPrismaを使用して以下のタスクを実行する方法を学ぶことができます。
- 環境をセットアップしてください。
- Prismaを使用してTiDBに接続します。
- アプリケーションをビルドして実行します。オプションで、基本的な CRUD 操作用のサンプルコードスニペットを見つけることができます。
注記:
このチュートリアルは、 TiDB Cloud Starter、 TiDB Cloud Essential、 TiDB Cloud Premium、 TiDB Cloud Dedicated、およびTiDB Self-Managedに対応しています。
前提条件
このチュートリアルを完了するには、以下が必要です。
TiDBクラスタをお持ちでない場合は、以下の手順で作成できます。
TiDBに接続するには、サンプルアプリを実行してください。
このセクションでは、サンプルアプリケーションコードを実行してTiDBに接続する方法を説明します。
ステップ1:サンプルアプリのリポジトリをクローンする
サンプルコードリポジトリをクローンするには、ターミナルウィンドウで以下のコマンドを実行してください。
git clone https://github.com/tidb-samples/tidb-nodejs-prisma-quickstart.git
cd tidb-nodejs-prisma-quickstart
ステップ2:依存関係をインストールする
サンプルアプリに必要なパッケージ( prismaを含む)をインストールするには、次のコマンドを実行してください。
npm install
既存のプロジェクトに依存関係をインストールします
既存のプロジェクトの場合、以下のコマンドを実行してパッケージをインストールしてください。
npm install prisma typescript ts-node @types/node --save-dev
ステップ3:接続パラメータを指定する
選択したTiDBのデプロイオプションに応じて、TiDBに接続してください。
私のTiDBページに移動し、対象のTiDB Cloud StarterまたはEssentialインスタンスの名前をクリックして、概要ページに移動します。
右上隅の「接続」をクリックしてください。接続ダイアログが表示されます。
接続ダイアログの設定がご使用のオペレーティング環境と一致していることを確認してください。
- 接続タイプは
Publicに設定されています。 - ブランチは
mainに設定されています。 - 「接続」は
Prismaに設定されています。 - オペレーティングシステムは、アプリケーションを実行するオペレーティングシステムと一致します。
- 接続タイプは
まだパスワードを設定していない場合は、 「パスワードを生成」をクリックしてランダムなパスワードを生成してください。
.env.exampleをコピーして.envに名前を変更するには、次のコマンドを実行します。cp .env.example .env.envファイルを編集し、環境変数DATABASE_URL次のように設定し、接続ダイアログで対応するプレースホルダー{}接続文字列に置き換えます。DATABASE_URL='{connection_string}'注記
TiDB Cloud Starterの場合、パブリックエンドポイントを使用する際には
sslaccept=strictを設定して TLS 接続を有効にする必要があります。.envファイルを保存します。prisma/schema.prismaで、mysqlを接続プロバイダとして、env("DATABASE_URL")接続 URL として設定します。datasource db { provider = "mysql" url = env("DATABASE_URL") }
私のTiDBページに移動し、対象のTiDB Cloud Premiumインスタンスの名前をクリックして概要ページに移動します。
左側のナビゲーションペインで、 [設定] > [ネットワーク]をクリックします。
ネットワークのページで、 [パブリックエンドポイント**を有効にする]をクリックし、次に[IP アドレスの追加]**をクリックします。
クライアントのIPアドレスがアクセスリストに追加されていることを確認してください。
左側のナビゲーションペインで「概要」をクリックすると、インスタンスの概要ページに戻ります。
右上隅の「接続」をクリックしてください。接続ダイアログが表示されます。
接続ダイアログで、 「接続タイプ」ドロップダウンリストから「パブリック」を選択します。
- 公開エンドポイントがまだ有効化中であることを示すメッセージが表示された場合は、処理が完了するまでお待ちください。
- まだパスワードを設定していない場合は、ダイアログの「ルートパスワードを設定」をクリックしてください。
- サーバー証明書を確認する必要がある場合、または接続に失敗して認証局(CA)証明書が必要な場合は、 「CA証明書」をクリックしてダウンロードしてください。
- パブリック接続タイプに加えて、 TiDB Cloud Premium はプライベート エンドポイント接続をサポートします。詳細については、 AWS PrivateLink経由でTiDB Cloud Premiumに接続します。を参照してください。
.env.exampleをコピーして.envに名前を変更するには、次のコマンドを実行します。cp .env.example .env.envファイルを編集し、環境変数DATABASE_URL次のように設定し、接続ダイアログで対応するプレースホルダー{}接続パラメータに置き換えます。DATABASE_URL='mysql://{user}:{password}@{host}:4000/test'.envファイルを保存します。prisma/schema.prismaで、mysqlを接続プロバイダとして、env("DATABASE_URL")接続 URL として設定します。datasource db { provider = "mysql" url = env("DATABASE_URL") }
私の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ファイルを編集し、環境変数DATABASE_URL次のように設定し、接続ダイアログで対応するプレースホルダー{}接続パラメータに置き換えます。DATABASE_URL='mysql://{user}:{password}@{host}:4000/test?sslaccept=strict&sslcert={downloaded_ssl_ca_path}'注記
TiDB Cloud Starterの場合、パブリックエンドポイントを使用する際には
sslaccept=strictを設定して TLS 接続を有効にすることをお勧め**します**。sslaccept=strictを設定して TLS 接続を有効にする場合は、sslcert=/path/to/ca.pemを介して接続ダイアログからダウンロードした CA 証明書のファイルパスを指定する必要があります。.envファイルを保存します。prisma/schema.prismaで、mysqlを接続プロバイダとして、env("DATABASE_URL")接続 URL として設定します。datasource db { provider = "mysql" url = env("DATABASE_URL") }
.env.exampleをコピーして.envに名前を変更するには、次のコマンドを実行します。cp .env.example .env.envファイルを編集し、環境変数DATABASE_URL次のように設定し、対応するプレースホルダー{}TiDB の接続パラメータに置き換えます。DATABASE_URL='mysql://{user}:{password}@{host}:4000/test'TiDBをローカルで実行している場合、デフォルトのホストアドレスは
127.0.0.1で、パスワードは空です。.envファイルを保存します。prisma/schema.prismaで、mysqlを接続プロバイダとして、env("DATABASE_URL")接続 URL として設定します。datasource db { provider = "mysql" url = env("DATABASE_URL") }
ステップ4.データベーススキーマを初期化する
次のコマンドを実行してプリズマ・マイグレートを呼び出し、 prisma/prisma.schemaで定義されたデータ モデルでデータベースを初期化します。
npx prisma migrate dev
prisma.schemaで定義されたデータモデル:
// Define a Player model, which represents the `players` table.
model Player {
id Int @id @default(autoincrement())
name String @unique(map: "uk_player_on_name") @db.VarChar(50)
coins Decimal @default(0)
goods Int @default(0)
createdAt DateTime @default(now()) @map("created_at")
profile Profile?
@@map("players")
}
// Define a Profile model, which represents the `profiles` table.
model Profile {
playerId Int @id @map("player_id")
biography String @db.Text
// Define a 1:1 relation between the `Player` and `Profile` models with foreign key.
player Player @relation(fields: [playerId], references: [id], onDelete: Cascade, map: "fk_profile_on_player_id")
@@map("profiles")
}
Prisma でデータ モデルを定義する方法については、データモデルデータモデルドキュメントを確認してください。
期待される実行出力:
Your database is now in sync with your schema.
✔ Generated Prisma Client (5.1.1 | library) to ./node_modules/@prisma/client in 54ms
このコマンドはprisma/prisma.schemaに基づいて TiDB データベースにアクセスするためのPrismaクライアントも生成します。
ステップ5:コードを実行する
サンプルコードを実行するには、以下のコマンドを実行してください。
npm start
サンプルコードの主なロジック:
// Step 1. Import the auto-generated `@prisma/client` package.
import {Player, PrismaClient} from '@prisma/client';
async function main(): Promise<void> {
// Step 2. Create a new `PrismaClient` instance.
const prisma = new PrismaClient();
try {
// Step 3. Perform some CRUD operations with Prisma Client ...
} finally {
// Step 4. Disconnect Prisma Client.
await prisma.$disconnect();
}
}
void main();
期待される実行出力:
接続が成功すると、ターミナルには次のようにTiDBのバージョンが出力されます。
🔌 Connected to TiDB cluster! (TiDB version: 8.0.11-TiDB-v8.5.4)
🆕 Created a new player with ID 1.
ℹ️ Got Player 1: Player { id: 1, coins: 100, goods: 100 }
🔢 Added 50 coins and 50 goods to player 1, now player 1 has 150 coins and 150 goods.
🚮 Player 1 has been deleted.
サンプルコードスニペット
以下のサンプルコードスニペットを参考に、独自のアプリケーション開発を完成させてください。
完全なサンプルコードと実行方法については、 tidb-samples/tidb-nodejs-prisma-quickstartリポジトリを参照してください。
データを挿入する
次のクエリは、単一のPlayerレコードを作成し、TiDB によって生成されたPlayerフィールドを含む、作成されたidオブジェクトを返します。
const player: Player = await prisma.player.create({
data: {
name: 'Alice',
coins: 100,
goods: 200,
createdAt: new Date(),
}
});
詳細については、データを挿入するを参照してください。
クエリデータ
次のクエリは、単一のPlayerオブジェクトを返します。このオブジェクトは、レコードが見つからない場合は、ID 101またはnullとなります。
const player: Player | null = prisma.player.findUnique({
where: {
id: 101,
}
});
詳細については、 クエリデータを参照してください。
データの更新
以下のクエリは、 50の ID を持つ50にPlayerコインと101の商品を追加します。
await prisma.player.update({
where: {
id: 101,
},
data: {
coins: {
increment: 50,
},
goods: {
increment: 50,
},
}
});
詳細については、データの更新を参照してください。
データを削除する
以下のクエリは、IDがPlayerである101 }を削除します。
await prisma.player.delete({
where: {
id: 101,
}
});
詳細については、データを削除するを参照してください。
役立つメモ
外部キー制約とPrismaリレーションモードの比較
参照整合性をチェックするには、外部キー制約または Prisma リレーション モードを使用できます。
外部キー、TiDB v6.6.0 以降でサポートされている機能であり、v8.5.0 以降で一般的に利用可能です。外部キーを使用すると、関連データのテーブル間参照が可能になり、外部キー制約によって関連データの一貫性が確保されます。
プリズマ関係モードPrisma クライアント側の参照整合性のエミュレーションです。ただし、参照整合性を維持するために追加のデータベース クエリが必要になるため、パフォーマンスに影響があることに注意してください。
次のステップ
- ORM フレームワーク Prisma ドライバーの使用方法の詳細についてはPrismaのドキュメント参照してください。
- 開発者ガイドデータを挿入する、データの更新、データを削除する、 クエリデータ、SQL 取引SQLパフォーマンス最適化などの章を読んで、TiDB アプリケーション開発のベスト プラクティスを学びましょう。
- プロフェッショナルなTiDB開発者向けコースコースを通じて学習し、試験に合格するとTiDB認定資格を取得します。
お困りですか?
- 不和or スラックコミュニティに質問してください。
- TiDB Cloudのサポートチケットを送信してください
- TiDB Self-Managedのサポートチケットを送信してください