📣
TiDB Cloud Essential はパブリックプレビュー中です。このページは自動翻訳されたものです。原文はこちらからご覧ください。

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



注記:

サーバーレスドライバーはベータ版であり、 TiDB Cloud StarterまたはTiDB Cloud Essentialインスタンスにのみ適用可能です。

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

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

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

注記:

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

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

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

npm install @tidbcloud/serverless

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

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

クエリ

TiDB Cloud StarterまたはTiDB Cloud Essentialインスタンスからデータをクエリするには、まず接続を作成する必要があります。その後、その接続を使用して生の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 }

エッジの例

エッジ環境でサーバーレスドライバーを使用する例をいくつかご紹介します。より詳しい例については、こちらのライブデモもご覧ください。

    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 StarterまたはTiDB Cloud Essentialインスタンスのユーザー名。
    password該当なしTiDB Cloud StarterまたはTiDB Cloud Essentialインスタンスのパスワード。
    host該当なしTiDB Cloud StarterまたはTiDB Cloud Essentialインスタンスのホスト名。
    databasetestTiDB Cloud StarterまたはTiDB Cloud Essentialインスタンスのデータベース。
    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

    結果オブジェクト全体を配列として返すには、 arrayModeおよびfullResultオプションを次のように設定します。

    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"})

    デコーダー

    返される列値のフォーマットをカスタマイズするには、 decoderメソッドのconnect()オプションを次のように設定します。

    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 がサポートされており、次の SQL ステートメントがサポートされています: SELECTSHOWEXPLAINUSEINSERTUPDATEDELETEBEGINCOMMITROLLBACK 、およびSET

    データ型マッピング

    TiDBとJavaScript間の型マッピングは以下のとおりです。

    TiDBデータ型JavaScriptタイプ
    TINYINT番号
    未署名TINYINT番号
    ブール番号
    スモールイント番号
    署名なしスモールイント番号
    メディウムミント番号
    INT番号
    署名なしインターセプト番号
    番号
    フロート番号
    ダブル番号
    ビッグイント
    符号なしBIGINT
    十進数
    チャール
    VARCHAR
    バイナリUint8Array
    二進法Uint8Array
    小さな文字
    TEXT
    中文
    長文
    タイニーブロブUint8Array
    ブロブUint8Array
    中型スロブUint8Array
    ロングブロブUint8Array
    日付
    時間
    日時
    タイムスタンプ
    列挙型
    セット
    少しUint8Array
    JSON物体
    NULLヌル
    その他

    注記:

    TiDB Cloud TiDB Cloudのデフォルトのutf8mb4 E}} 文字セットを使用するようにしてください。

    注記:

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

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

    ORM連携

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

    価格設定

    サーバーレスドライバー自体は無料ですが、ドライバーを使用してデータにアクセスすると要求単位(RU)とstorageの使用量が発生します。

    制限事項

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

    • 1回のクエリで最大10,000行まで取得できます。
    • 一度に実行できるSQL文は1つだけです。1つのクエリで複数のSQL文を実行することは、現時点ではサポートされていません。
    • プライベートエンドポイントとの接続にはまだ対応していません。
    • サーバーは、クロスオリジンリソース共有(CORS)を介して、許可されていないブラウザからのリクエストをブロックし、認証情報を保護します。そのため、サーバーレスドライバーはバックエンドサービスからのみ使用できます。

    次は?

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