📣

TiDB Cloud Serverless が
Starter
に変わりました!このページは自動翻訳されたものです。
原文はこちらからご覧ください。

Prisma を使用して TiDB に接続する

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

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

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

注記:

このチュートリアルは、TiDB サーバーレス、TiDB 専用、および TiDB セルフホストで動作します。

前提条件

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

  • 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 クラスターに接続します。

    1. クラスターページに移動し、ターゲット クラスターの名前をクリックして、その概要ページに移動します。

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

    3. 接続ダイアログの設定が動作環境と一致していることを確認してください。

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

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

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

      DATABASE_URL={connection_string}

      注記

      TiDB サーバーレスの場合、パブリック エンドポイントを使用する場合は、 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. 「どこからでもアクセスを許可」をクリックし、 「TiDB クラスター CA のダウンロード」をクリックして CA 証明書をダウンロードします。

      接続文字列の取得方法の詳細については、 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 サーバーレスの場合、パブリック エンドポイントを使用する場合は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: 5.7.25-TiDB-v6.6.0-serverless) 🆕 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 によって生成された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 101Player50コインと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 クライアント側での参照整合性のエミュレーションです。ただし、参照整合性を維持するために追加のデータベース クエリが必要になるため、パフォーマンスに影響があることに注意してください。

    次のステップ

    助けが必要?

    不和またはサポートチケットを作成するについて質問してください。

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