TiDB CloudサーバーレスDriver(ベータ版)

TiDB Cloud Serverless Driver (ベータ版) を使用する理由

従来の TCP ベースの MySQL ドライバーは、長寿命で永続的な TCP 接続を期待しているため、サーバーレス関数には適していません。これは、サーバーレス関数の短寿命の性質と矛盾しています。さらに、包括的な TCP サポートと完全な Node.js 互換性が欠如している可能性のあるVercel エッジ機能Cloudflare ワーカーなどのエッジ環境では、これらのドライバーがまったく機能しない可能性があります。

JavaScript 用のTiDB Cloudサーバーレス ドライバー (ベータ版)使用すると、サーバーレス環境で一般的にサポートされている HTTP 経由でTiDB Cloud Serverless クラスターに接続できます。これにより、従来の TCP ベースの MySQL ドライバーと同様の開発エクスペリエンスを維持しながら、エッジ環境からTiDB Cloud Serverless クラスターに接続し、TCP による接続オーバーヘッドを削減できるようになりました。

注記:

SQL や ORM ではなく RESTful API でプログラミングしたい場合は、 データ サービス (ベータ版)使用できます。

サーバーレスドライバーをインストールする

npm を使用してドライバーをインストールできます。

npm install @tidbcloud/serverless

サーバーレスドライバーを使用する

サーバーレス ドライバーを使用して、 TiDB Cloud Serverless クラスターのデータを照会したり、対話型トランザクションを実行したりできます。

クエリ

TiDB Cloud Serverless クラスターからデータをクエリするには、まず接続を作成する必要があります。次に、接続を使用して生の SQL クエリを実行できます。例:

import { connect } from '@tidbcloud/serverless' const conn = connect({url: 'mysql://[username]:[password]@[host]/[database]'}) const results = await conn.execute('select * from test where id = ?',[1])

トランザクション(実験的)

サーバーレス ドライバーを使用して対話型トランザクションを実行することもできます。例:

import { connect } from '@tidbcloud/serverless' const conn = connect({url: 'mysql://[username]:[password]@[host]/[database]'}) const tx = await conn.begin() try { await tx.execute('insert into test values (1)') await tx.execute('select * from test') await tx.commit() } catch (err) { await tx.rollback() throw err }

エッジの例

エッジ環境でサーバーレス ドライバーを使用する例をいくつか示します。完全な例については、こちらライブデモも試してください。

  • Vercel Edge Function
  • Cloudflare Workers
  • Netlify Edge Function
  • Deno
  • Bun
import { NextResponse } from 'next/server'; import type { NextRequest } from 'next/server'; import { connect } from '@tidbcloud/serverless' export const runtime = 'edge' export async function GET(request: NextRequest) { const conn = connect({url: process.env.DATABASE_URL}) const result = await conn.execute('show tables') return NextResponse.json({result}); }

Vercel でTiDB Cloudサーバーレス ドライバーを使用するについて詳しく学びます。

import { connect } from '@tidbcloud/serverless' export interface Env { DATABASE_URL: string; } export default { async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise<Response> { const conn = connect({url: env.DATABASE_URL}) const result = await conn.execute('show tables') return new Response(JSON.stringify(result)); }, };

Cloudflare Workers でTiDB Cloudサーバーレス ドライバーを使用するについて詳しく学びます。

import { connect } from 'https://esm.sh/@tidbcloud/serverless' export default async () => { const conn = connect({url: Netlify.env.get('DATABASE_URL')}) const result = await conn.execute('show tables') return new Response(JSON.stringify(result)); }

Netlify でTiDB Cloudサーバーレス ドライバーを使用するについて詳しく学びます。

import { connect } from "npm:@tidbcloud/serverless" const conn = connect({url: Deno.env.get('DATABASE_URL')}) const result = await conn.execute('show tables')
import { connect } from "@tidbcloud/serverless" const conn = connect({url: Bun.env.DATABASE_URL}) const result = await conn.execute('show tables')

サーバーレスドライバーを構成する

TiDB Cloudサーバーレス ドライバーは、接続レベルと SQL レベルの両方で構成できます。

接続レベルの構成

接続レベルでは、次の構成を行うことができます。

名前タイプデフォルト値説明
username該当なしTiDB Cloud Serverlessのユーザー名
password該当なしTiDB Cloud Serverlessのパスワード
host該当なしTiDB Cloud Serverlessのホスト名
databasetestTiDB Cloud Serverlessのデータベース
url該当なしデータベースの URL はmysql://[username]:[password]@[host]/[database]形式で、デフォルトのデータベースに接続する場合はdatabaseスキップできます。
fetch関数グローバルフェッチカスタム フェッチ関数。たとえば、node.js のundiciフェッチを使用できます。
arrayModeブールfalse結果をオブジェクトではなく配列として返すかどうか。パフォーマンスを向上させるには、 trueに設定します。
fullResultブールfalse行だけではなく完全な結果オブジェクトを返すかどうか。より詳細な結果を取得するには、 trueに設定します。
decoders物体{}キーと値のペアのコレクション。これにより、さまざまな列タイプのデコード プロセスをカスタマイズできます。各ペアでは、列タイプをキーとして指定し、対応する関数を値として指定できます。この関数は、 TiDB Cloudサーバーレス ドライバーから受信した生の文字列値を引数として受け取り、デコードされた値を返します。

データベースURL

注記:

ユーザー名、パスワード、またはデータベース名に特殊文字が含まれている場合は、URL で渡すときにこれらの文字をパーセンテージエンコードエンコードする必要があります。たとえば、パスワードpassword1@//? 、URL ではpassword1%40%2F%2F%3Fとしてエンコードする必要があります。

url設定されている場合、 hostusernamepassword 、およびdatabase個別に設定する必要はありません。次のコードは同等です。

const config = { host: '<host>', username: '<user>', password: '<password>', database: '<database>', arrayMode: true, } const conn = connect(config)
const config = { url: process.env['DATABASE_URL'] || 'mysql://[username]:[password]@[host]/[database]', arrayMode: true } const conn = connect(config)

SQL レベル オプション

注記:

SQL レベルのオプションは、接続レベルの構成よりも優先されます。

SQL レベルでは、次のオプションを構成できます。

オプションタイプデフォルト値説明
arrayModeブールfalse結果をオブジェクトではなく配列として返すかどうか。パフォーマンスを向上させるには、 trueに設定します。
fullResultブールfalse行だけではなく、完全な結果オブジェクトを返すかどうか。より詳細な結果を取得するには、 trueに設定します。
isolationREPEATABLE READトランザクション分離レベル。 READ COMMITTEDまたはREPEATABLE READに設定できます。
decoders物体{}キーと値のペアのコレクション。これにより、さまざまな列の種類のデコード処理をカスタマイズできます。各ペアでは、列の種類をキーとして指定し、対応する関数を値として指定できます。この関数は、 TiDB Cloudサーバーレス ドライバーから受け取った生の文字列値を引数として受け取り、デコードされた値を返します。接続レベルと SQL レベルの両方でdecoders設定した場合、接続レベルで設定された異なるキーを持つキーと値のペアは、SQL レベルにマージされて有効になります。両方のレベルで同じキー (つまり、列の種類) が指定されている場合は、SQL レベルの値が優先されます。

arrayMode と fullResult

完全な結果オブジェクトを配列として返すには、オプションarrayModefullResult次のように構成します。

const conn = connect({url: process.env['DATABASE_URL'] || 'mysql://[username]:[password]@[host]/[database]'}) const results = await conn.execute('select * from test',null,{arrayMode:true,fullResult:true})

分離

isolationオプションはbegin機能でのみ使用できます。

const conn = connect({url: 'mysql://[username]:[password]@[host]/[database]'}) const tx = await conn.begin({isolation:"READ COMMITTED"})

デコーダー

返される列の値の形式をカスタマイズするには、 connect()メソッドのdecoderオプションを次のように構成します。

import { connect, ColumnType } from '@tidbcloud/serverless'; const conn = connect({ url: 'mysql://[username]:[password]@[host]/[database]', decoders: { // By default, TiDB Cloud serverless driver returns the BIGINT type as text value. This decoder converts BIGINT to the JavaScript built-in BigInt type. [ColumnType.BIGINT]: (rawValue: string) => BigInt(rawValue), // By default, TiDB Cloud serverless driver returns the DATETIME type as the text value in the 'yyyy-MM-dd HH:mm:ss' format. This decoder converts the DATETIME text to the JavaScript native Date object. [ColumnType.DATETIME]: (rawValue: string) => new Date(rawValue), } }) // You can also configure the decoder option at the SQL level to override the decoders with the same keys at the connection level. conn.execute(`select ...`, [], { decoders: { // ... } })

注記:

TiDB Cloudサーバーレス ドライバー構成の変更:

  • v0.0.7: SQL レベル オプションisolationを追加します。
  • v0.0.10: 接続レベルの構成decodersと SQL レベル オプションdecodersを追加します。

特徴

サポートされているSQL文

DDL がサポートされDELETE UPDATE 、次のSETステートメントEXPLAINサポートされSHOW USE INSERT COMMIT SELECT BEGINおよびROLLBACK

データ型マッピング

TiDB Cloud Serverless と Javascript 間の型マッピングは次のとおりです。

TiDB CloudサーバーレスタイプJavascriptタイプ
小さな番号
符号なし TINYINT番号
ブール番号
スモールイント番号
符号なし小整数番号
ミディアムミント番号
内部番号
符号なし整数番号
番号
フロート番号
ダブル番号
ビッグイント
符号なしBIGINT
小数点
文字
バルチャー
バイナリUint8配列
バイナリUint8配列
小さなテキスト
TEXT
中テキスト
長文
タイニーブロブUint8配列
ブロブUint8配列
ミディアムブロブUint8配列
ロングロブUint8配列
日付
時間
日時
タイムスタンプ
列挙
セット
少しUint8配列
翻訳物体
NULLヌル
その他

注記:

TiDB Cloudサーバーレス ドライバーは UTF-8 エンコーディングを使用して JavaScript 文字列を文字列にデコードするため、JavaScript 文字列への型変換にはTiDB Cloudサーバーレスのデフォルトのutf8mb4文字セットを使用するようにしてください。

注記:

TiDB Cloudサーバーレス ドライバーのデータ型マッピングの変更:

  • v0.1.0: BINARYVARBINARYTINYBLOBBLOBMEDIUMBLOBLONGBLOB 、およびBITタイプは、 stringではなくUint8Arrayとして返されるようになりました。

ORM統合

TiDB Cloudサーバーレス ドライバーは、次の ORM と統合されています。

価格

サーバーレス ドライバー自体は無料ですが、ドライバーを使用してデータにアクセスするとリクエストユニット (RU)とstorage使用量が発生します。価格はTiDB Cloud Serverless の価格モデルに従います。

制限事項

現在、サーバーレス ドライバーの使用には次の制限があります。

  • 1 回のクエリで最大 10,000 行を取得できます。
  • 一度に実行できる SQL ステートメントは 1 つだけです。1 つのクエリで複数の SQL ステートメントを実行することはまだサポートされていません。
  • プライベートエンドポイントとの接続はまだサポートされていません。

次は何か

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