Bun.sql を標準搭載した JavaScript / TypeScript ランタイムです。そのため、ドライバーを別途インストールする必要はありません。
このガイドでは、証明書検証付きの TLS で Bun を ClickHouse Managed Postgres に接続し、テーブルの作成、クエリおよびトランザクションの実行を行ったうえで、Bun.serve を使って行データを HTTP で配信します。
前提条件
- Bun 1.4 以降。本ガイドは Bun 1.4.2 および Postgres 18 で動作確認済みです。
- ClickHouse Cloud のアカウント。
- データベース作成用の
psql。CREATE DATABASEステートメントは SQL コンソール で実行することもできます。
ClickHouse Managed Postgres サービスを作成する
ClickHouse Cloud コンソールで New service をクリックし、Postgres を選択します。インスタンスは数分で利用可能になります。詳しい手順については、クイックスタートを参照してください。接続情報を取得する
サービスを開き、左サイドバーの Connect をクリックします。Directly は選択したままにし、Use SSL をオンにします。これで URL の末尾がsslmode=verify-full&sslrootcert=... になります。Download CA certificate をクリックして、インスタンスの CA 証明書をダウンロードします。
このガイドでは、ポート 5432 で直接接続します。Bun.serve アプリは長時間稼働するプロセスであり、Bun.sql は独自の接続プールを持つため、サーバー側のプーラーは必要ありません。短時間で終了する Bun プロセスを多数実行する場合は、PgBouncer 経由で接続するを参照してください。
プロジェクトのセットアップ
プロジェクトを作成します。接続を設定する
ダウンロードした CA 証明書をプロジェクト内に移動し、ファイル名をca-certificate.pem にリネームします。
<PASSWORD> とホストは、Connect モーダルに表示される値に置き換えてください。
guide_bun データベースへの接続 URL を .env に追加します (ファイルが存在しない場合は作成してください) 。Bun は .env を自動的に読み込み、bun からエクスポートされる sql は DATABASE_URL を参照します。
.env
.env はバージョン管理の対象外にしてください。
次のスクリプトを package.json に追加します。scripts ブロックがすでにある場合は、その中にマージしてください。これらのスクリプトは、NODE_EXTRA_CA_CERTS を介して CA 証明書を Bun に渡します。
package.json
Bun がサーバー証明書を検証する仕組み
sslmode=verify-fullを指定すると、Bun.sqlは証明書チェーンとホスト名の両方を検証します。- コンソールの URL に含まれる
sslrootcertパラメータはコピーしないでください。Bun.sqlはこのパラメータを解釈せず、ランタイム設定としてそのままサーバーへ渡します。その結果、unrecognized configuration parameter "sslrootcert"というエラーで接続に失敗します。 NODE_EXTRA_CA_CERTSは、Bun の起動時点で環境変数として設定されている必要があります。Bun はこの値を.envから読み込まないため、スクリプト内で設定しています。- Bun 1.4.2 では、ダウンロードした証明書を
SQLのtls: { ca }オプションで渡すと、certificate signature failureというエラーで失敗します。代わりにNODE_EXTRA_CA_CERTSを使用してください。
テーブルを作成する
setup.ts を作成します。このスクリプトは session の TLS の状態を出力してから、todos テーブルを作成します。
setup.ts
データベースにクエリを実行する
Bun.sql ではタグ付きテンプレートを使用します。埋め込まれた値はすべてバインドパラメータとして送信されるため、ユーザー入力をそのまま渡しても安全です。queries.ts を作成します。
queries.ts
sql.begin はコールバックをトランザクション内で実行します。コールバックが正常に戻るとコミットし、例外がスローされるとロールバックします。
実行してみましょう:
HTTP 経由で行を返す
行の一覧取得と作成を行う/todos エンドポイントを持つ server.ts を作成します。
server.ts
動作確認
ブラウザで http://localhost:3106/todos を開くと、すべての行を確認できます。レスポンスは次のようになります (読みやすいように整形しています) 。PgBouncer 経由で接続する
短時間で終了する Bun プロセスを多数実行する場合は、代わりに同梱の PgBouncer を経由して接続してください。Connect モーダルで via PgBouncer を選択し、DATABASE_URL のポートを 6432 に変更します。CA 証明書と sslmode=verify-full は変更不要です。
PgBouncer はトランザクションプーリングモードで動作します。Bun.sql はデフォルトで名前付きプリペアドステートメントを使用しますが、当社のテストでは PgBouncer 経由でも問題なく動作しました。prepared statement does not exist エラーが発生する場合は、prepare: false を指定してクライアントを作成してください。
prepare は URL に含めず、オプションとして渡してください。sslrootcert と同様に、prepare=false を URL パラメータとして指定すると、サーバーに転送されて拒否されます。
次のステップ
- 接続: 接続文字列、PgBouncer、TLS
- 設定: Postgres および PgBouncer のパラメータの変更
- 読み取りレプリカ: 読み取り処理のスケーリング
- Bun SQL ドキュメント:
Bun.sqlAPI の完全なリファレンス