Serverless Driverとは
TiDB CloudのServerless Driverは、通常MySQLプロトコルで接続ができないEdge FunctionからHTTPSでTiDB Serverlessに接続するためのドライバです。
9月19日にひっそりとBetaで公開されました。
従来はData proxyなどを経由したり、APIを作ったりする必要があったかと思いますが、これで直接利用できることになり、開発がサクサク進むことが期待されます。
公式ドキュメント、リポジトリなど
デモではよくある分析ダッシュボードのバックエンドをVercel, Cloudflare, Netlifyのそれぞれで動かし、TiDB Serverlessに直接接続しています。実際の利用例はこちらを参照すると良いと思います。
最小セットで試す
公式ドキュメントにある、こちらのソースコードと同等のものをローカル環境でさっくり試してみることにします。
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])
console.log(results)
1. TiDB Serverlessで適当なクラスタを立ち上げて接続文字列を取得
TiDB CloudのコンソールからServerlessクラスタを起動し、connectボタンを押してパスワードを設定します。接続文字列はSQL Alchemyの形式なので、connect with
メニューでSQL Alchemyを選択すると簡単です。デフォルトでTLS接続をするようなので ?ssl_ca=
から先は不要です。
この例だとtestというデータベースに接続しています。クラスタを作成すると自動で作られているはずです。
2. 適当なテーブルを作成
適当なtestテーブルを作成します。TiDB CloudのChat2QueryメニューからSQLエディタでDDLを流します。
USE test;
CREATE TABLE test (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(20) NOT NULL
);
INSERT INTO test (name) VALUES ('Taro Yamada'),('Hanako Suzuki'),('Jiro Tanaka');
3. サンプルソースを準備
適当なディレクトリを作成して、下記を実行します。
その後、公式のサンプルコードの接続文字列を変更して serverless.ts
という名前で保存しています。
% npm init
% npm install typescript
% npm install "@tidbcloud/serverless"
% ls
node_modules package-lock.json package.json serverless.ts
4. トランスパイルと実行(注意)
ここでちょっとハマったのですが、TiDB Serverless DriverはES moduleなので、nodejsで実行する際に type: module
の指定が必要でした。 package.json を書き換えます。
{
+ "type":"module",
"dependencies": {
"@tidbcloud/serverless": "^0.0.5",
"typescript": "^5.2.2"
}
}
あとは、tscでトランスパイルして、実行するだけです。tscを使う際のオプションもES Module対応にする必要があります。この辺はNext.jsやパッケージマネージャーはよろしくやってくれるようですね。
% tsc -t es2020 -m esnext --moduleResolution node serverless.ts
% node serverless.js
5. 実行結果
% node serverless.js
[ { id: 1, name: 'Taro Yamada' } ]
無事、出力されました。
型安全なSQL
ただこのままだとSQLを直書きしないといけないです。せっかくtypescriptを使っているので型安全にSQLを作りたい... という人はKyselyアダプタを作っているようなので是非試して見ると良いと思います。