PrismaでTiDBに接続する

TiDB は MySQL 互換のデータベースであり、 プリズマ Node.js 用の人気のあるオープンソース ORM フレームワークです。

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

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

注記:

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

前提条件

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

  • Node.js >= 16.x がマシンにインストールされています。
  • ギットマシンにインストールされています。
  • 実行中の TiDB クラスター。

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

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

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

    • 接続タイプはPublicに設定されています。
    • ブランチはmainに設定されています。
    • Connect With はPrismaに設定されています。
    • オペレーティング システムは、アプリケーションを実行するオペレーティング システムと一致します。
  4. まだパスワードを設定していない場合は、「パスワードの生成」をクリックしてランダムなパスワードを生成します。

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

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

    DATABASE_URL='{connection_string}'

    注記

    TiDB Cloud Serverless の場合、パブリック エンドポイントを使用するときは、 sslaccept=strict設定して TLS 接続を有効にする必要があります

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

  8. prisma/schema.prismaで、接続プロバイダーとしてmysql設定し、接続 URL としてenv("DATABASE_URL")設定します。

    datasource db { provider = "mysql" url = env("DATABASE_URL") }
  1. クラスターページに移動し、ターゲット クラスターの名前をクリックして概要ページに移動します。

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

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

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

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

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

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

    DATABASE_URL='mysql://{user}:{password}@{host}:4000/test?sslaccept=strict&sslcert={downloaded_ssl_ca_path}'

    注記

    TiDB Cloud Serverless の場合、パブリックエンドポイントを使用する場合は、 sslaccept=strict設定して TLS 接続を有効にすることをお勧めしますsslaccept=strict設定して TLS 接続を有効にする場合は、 sslcert=/path/to/ca.pemを介して接続ダイアログからダウンロードした CA 証明書のファイル パスを指定する必要があります

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

  7. prisma/schema.prismaで、接続プロバイダーとしてmysql設定し、接続 URL としてenv("DATABASE_URL")設定します。

    datasource db { provider = "mysql" url = env("DATABASE_URL") }
  1. 次のコマンドを実行して.env.exampleコピーし、名前を.envに変更します。

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

    DATABASE_URL='mysql://{user}:{password}@{host}:4000/test'

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

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

  4. prisma/schema.prismaで、接続プロバイダーとしてmysql設定し、接続 URL としてenv("DATABASE_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 データベースにアクセスするためのプリズマクライアント生成します。

ステップ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.1.1) 🆕 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-クイックスタートリポジトリを参照してください。

データを挿入

次のクエリは、単一のPlayerレコードを作成し、TiDB によって生成されたidフィールドを含む作成されたPlayerオブジェクトを返します。

const player: Player = await prisma.player.create({ data: { name: 'Alice', coins: 100, goods: 200, createdAt: new Date(), } });

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

クエリデータ

次のクエリは、レコードが見つからない場合は ID 101またはnullを持つ単一のPlayerオブジェクトを返します。

const player: Player | null = prisma.player.findUnique({ where: { id: 101, } });

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

データの更新

次のクエリは、 ID 101Playerにコイン50枚と商品50を追加します。

await prisma.player.update({ where: { id: 101, }, data: { coins: { increment: 50, }, goods: { increment: 50, }, } });

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

データを削除する

次のクエリは、ID 101Player削除します。

await prisma.player.delete({ where: { id: 101, } });

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

役に立つメモ

外部キー制約と Prisma リレーション モード

参照整合性確認するには、外部キー制約または Prisma リレーション モードを使用できます。

  • 外部キーは、TiDB v6.6.0 からサポートされている実験的機能であり、関連データのテーブル間参照と、データの一貫性を維持するための外部キー制約を可能にします。

  • プリズマ関係モード 、Prisma クライアント側での参照整合性のエミュレーションです。ただし、参照整合性を維持するために追加のデータベース クエリが必要になるため、パフォーマンスに影響があることに注意してください。

次のステップ

ヘルプが必要ですか?

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

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