TiDB Cloud Serverless Driver Kysely チュートリアル
キセリー、タイプセーフでオートコンプリートに適した TypeScript SQL クエリ ビルダーです。 TiDB Cloudは@tidbcloud/kyselyを提供しており、 TiDB Cloudサーバーレスドライバーを使用して HTTPS 経由で Kysely を使用できるようにします。従来の TCP 方式と比較して、 @tidbcloud/kyselyは次の利点があります。
- サーバーレス環境におけるパフォーマンスの向上。
- Kyselyをエッジ環境で使用できる機能。
このチュートリアルでは、Node.js環境およびエッジ環境で、 TiDB CloudサーバーレスドライバーをKyselyと組み合わせて使用する方法について説明します。
Node.js環境でTiDB Cloud Kysely方言を使用する
このセクションでは、Node.js環境でKyselyとTiDB Cloudサーバーレスドライバーを連携させる方法について説明します。
始める前に
このチュートリアルを完了するには、以下のものが必要です。
- Node.js >= 18.0.0。
- npm 、またはお好みのパッケージマネージャーを使用してください。
- TiDB Cloud Starterインスタンス。お持ちでない場合は、 TiDB Cloud Starterインスタンスを作成する。
ステップ1. プロジェクトを作成する
kysely-node-exampleという名前のプロジェクトを作成します。mkdir kysely-node-example cd kysely-node-examplekysely、@tidbcloud/kysely、および@tidbcloud/serverlessパッケージをインストールしてください。npm install kysely @tidbcloud/kysely @tidbcloud/serverlessプロジェクトのルートディレクトリで、
package.jsonファイルを探し、そのファイルに"type": "module"を追加して ES モジュールを指定します。{ "type": "module", "dependencies": { "@tidbcloud/kysely": "^0.0.4", "@tidbcloud/serverless": "^0.0.7", "kysely": "^0.26.3", } }プロジェクトのルートディレクトリに、TypeScriptコンパイラオプションを定義する
tsconfig.jsonファイルを追加します。以下にファイルの例を示します。{ "compilerOptions": { "module": "ES2022", "target": "ES2022", "moduleResolution": "node", "strict": false, "declaration": true, "outDir": "dist", "removeComments": true, "allowJs": true, "esModuleInterop": true, "resolveJsonModule": true } }
ステップ2. 環境を設定する
TiDB Cloud Starterインスタンスの概要ページで、右上隅の「接続」をクリックし、表示されたダイアログからデータベースの接続文字列を取得します。接続文字列は次のようになります。
mysql://[username]:[password]@[host]/[database]ローカル環境で環境変数
DATABASE_URLを設定してください。例えば、Linux または macOS では、次のコマンドを実行できます。export DATABASE_URL='mysql://[username]:[password]@[host]/[database]'
ステップ3. Kyselyを使用してデータをクエリする
TiDB Cloud Starterインスタンスにテーブルを作成し、データを挿入してください。
TiDB CloudコンソールのSQLエディタ使用してSQLステートメントを実行できます。以下に例を示します。
CREATE TABLE `test`.`person` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) NULL DEFAULT NULL, `gender` enum('male','female') NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE ); insert into test.person values (1,'pingcap','male')プロジェクトのルートディレクトリに、
hello-world.tsという名前のファイルを作成し、以下のコードを追加してください。import { Kysely,GeneratedAlways,Selectable } from 'kysely' import { TiDBServerlessDialect } from '@tidbcloud/kysely' // Types interface Database { person: PersonTable } interface PersonTable { id: GeneratedAlways<number> name: string gender: "male" | "female" } // Dialect const db = new Kysely<Database>({ dialect: new TiDBServerlessDialect({ url: process.env.DATABASE_URL }), }) // Simple Querying type Person = Selectable<PersonTable> export async function findPeople(criteria: Partial<Person> = {}) { let query = db.selectFrom('person') if (criteria.name){ query = query.where('name', '=', criteria.name) } return await query.selectAll().execute() } console.log(await findPeople())
ステップ4.TypeScriptコードを実行する
TypeScript を JavaScript に変換するには
ts-nodeをインストールし、次に Node.js 用の TypeScript 型定義を提供するには@types/nodeをインストールします。npm install -g ts-node npm i --save-dev @types/node以下のコマンドでTypeScriptコードを実行してください。
ts-node --esm hello-world.ts
エッジ環境では、 TiDB Cloud Kysely 方言を使用する
このセクションでは、Vercel Edge Function のTiDB Cloud Kysely 方言を例として取り上げます。
始める前に
このチュートリアルを完了するには、以下のものが必要です。
- エッジ環境を提供するヴェルセルアカウント。
- npm 、またはお好みのパッケージマネージャーを使用してください。
- TiDB Cloud Starterインスタンス。お持ちでない場合は、 TiDB Cloud Starterインスタンスを作成する。
ステップ1. プロジェクトを作成する
Vercel CLIをインストールしてください。
npm i -g vercel@latest以下のターミナルコマンドを使用して
kysely-exampleという名前のNext.jsプロジェクトを作成します。npx create-next-app@latest kysely-example --ts --no-eslint --tailwind --no-src-dir --app --import-alias "@/*" cd kysely-examplekysely、@tidbcloud/kysely、および@tidbcloud/serverlessパッケージをインストールしてください。npm install kysely @tidbcloud/kysely @tidbcloud/serverless
ステップ2. 環境を設定する
TiDB Cloud Starterインスタンスの概要ページで、右上隅の「接続」をクリックし、表示されたダイアログからデータベースの接続文字列を取得します。接続文字列は次のようになります。
mysql://[username]:[password]@[host]/[database]
ステップ3. エッジ関数を作成する
TiDB Cloud Starterインスタンスにテーブルを作成し、データを挿入してください。
TiDB CloudコンソールのSQLエディタ使用してSQL文を実行できます。以下に例を示します。
CREATE TABLE `test`.`person` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) NULL DEFAULT NULL, `gender` enum('male','female') NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE ); insert into test.person values (1,'pingcap','male')プロジェクトの
appディレクトリに、/api/edge-function-example/route.tsファイルを作成し、以下のコードを追加します。import { NextResponse } from 'next/server'; import type { NextRequest } from 'next/server'; import { Kysely,GeneratedAlways,Selectable } from 'kysely' import { TiDBServerlessDialect } from '@tidbcloud/kysely' export const runtime = 'edge'; // Types interface Database { person: PersonTable } interface PersonTable { id: GeneratedAlways<number> name: string gender: "male" | "female" | "other" } // Dialect const db = new Kysely<Database>({ dialect: new TiDBServerlessDialect({ url: process.env.DATABASE_URL }), }) // Query type Person = Selectable<PersonTable> async function findPeople(criteria: Partial<Person> = {}) { let query = db.selectFrom('person') if (criteria.name){ query = query.where('name', '=', criteria.name) } return await query.selectAll().execute() } export async function GET(request: NextRequest) { const searchParams = request.nextUrl.searchParams const query = searchParams.get('query') let response = null; if (query) { response = await findPeople({name: query}) } else { response = await findPeople() } return NextResponse.json(response); }上記のコードは、クエリパラメータ
queryを受け取り、クエリの結果を返します。クエリパラメータが指定されていない場合は、personテーブル内のすべてのレコードを返します。コードをローカル環境でテストしてください。
export DATABASE_URL='mysql://[username]:[password]@[host]/[database]' next devhttp://localhost:3000/api/edge-function-exampleに移動して、ルートからの応答を取得してください。
ステップ4.Vercelにコードをデプロイ
DATABASE_URL環境変数を使用して、Vercelにコードをデプロイ。vercel -e DATABASE_URL='mysql://[username]:[password]@[host]/[database]' --prodデプロイが完了すると、プロジェクトのURLが発行されます。
${Your-URL}/api/edge-function-exampleページに移動して、ルートからの応答を取得してください。
次は?
- キセリーと@tidbcloud/kyselyについてもっと詳しく知りたい方はこちらをご覧ください。
- TiDB CloudとVercelを統合する方法を学ぶ