pg ドライバーを使用し、証明書検証付きの TLS で Kysely を ClickHouse Managed Postgres に接続します。さらに、Kysely の移行機能でテーブルを作成し、Node.js で小規模な ToDo API を提供します。
前提条件
- Node.js 22.18 以降。このバージョンでは、ビルド手順なしで TypeScript ファイルを直接実行できます。本ガイドのファイルは
.mts拡張子を使用しているため、CommonJS プロジェクトと ES モジュールプロジェクトのどちらでも、Node.js はこれらを ES モジュールとして扱います。 - ClickHouse Cloud アカウント。
- データベースを作成するための
psql。CREATE DATABASEステートメントは SQL コンソール で実行することもできます。 - API を呼び出すための
curl。
pg 8.23.1、TypeScript 7.0.2、PostgreSQL 18 で動作確認済みです。
ClickHouse Managed Postgres サービスを作成する
ClickHouse Cloud コンソールで New service をクリックし、Postgres を選択します。インスタンスは数分で利用可能になります。詳しい手順については、クイックスタートを参照してください。接続情報を取得する
サービスの左サイドバーで Connect をクリックします。Directly を選択したまま Use SSL をオンにすると、url の接続文字列の末尾がsslmode=verify-full&sslrootcert=... になります。Download CA certificate をクリックしてサービスの CA 証明書 (<service-name>-ca-certificate.pem) をダウンロードし、接続文字列をコピーします。
このガイドでは、次の 2 つの理由から、ポート 5432 で Postgres に直接接続します。
- Node.js サーバーは長時間稼働するプロセスです。
pgのPoolが少数の接続を開いたまま再利用するため、サーバー側のプーラーを追加してもメリットはほとんどありません。 - Kysely の
Migratorは、移行の実行中にセッションレベルのアドバイザリーロック (pg_advisory_lock) を保持します。PgBouncer はトランザクションプーリングモードで動作するため、ロックの取得、移行の実行、ロックの解放がそれぞれ別のバックエンド接続で行われる可能性があります。その結果、PgBouncer 経由ではプール内の接続でロックが保持されたままになり、以降の移行がロックの解放を待ってブロックされることがあります。
6432) に変更できます。pg はデフォルトで名前なしのプリペアドステートメントを使用するため、pg を使った Kysely はトランザクションプーリングモードでも問題なく動作します。ただし、移行は引き続きポート 5432 に対して実行してください。詳しくは PgBouncer 接続プーリング を参照してください。
プロジェクトのセットアップ
プロジェクトを作成し、Kysely、pg ドライバー、TypeScript をインストールします。
接続を設定する
ダウンロードしたCA証明書をプロジェクトディレクトリに移動し、ファイル名をca-certificate.pem にリネームします。続いて、アプリ用のデータベースを作成します。
.env ファイル、または既存の .env に追加します。<PASSWORD> を実際のパスワードに、データベース名を guide_kysely に置き換え、sslrootcert に ca-certificate.pem を設定します。
.env
pg は接続文字列から sslmode と sslrootcert を読み取ります。verify-full を指定すると、サーバー証明書がサービスの CA によって署名されていること、および証明書がホスト名と一致することが検証されます。sslrootcert は作業ディレクトリからの相対パスとして解決されます。npm run を使用する場合、作業ディレクトリはプロジェクトのルートになります。
Node.js が実行するファイルと同じファイルを tsc で型チェックできるように、tsconfig.json を追加します。アプリにすでに tsconfig.json がある場合は、以下の compilerOptions と migrations フォルダーをそこにマージしてください。
tsconfig.json
データベースインターフェイスを定義する
Kysely は、テーブル構造を記述したインターフェイスをもとに、すべてのクエリに型を付けます。src/db.mts を作成し、このインターフェイスと、pg の Pool を使った PostgresDialect を利用する Kysely インスタンスを定義します。
src/db.mts
Generated は、データベース側で値が自動設定されるカラムを表します。そのため、挿入時にこれらのカラムを指定する必要はありません。
移行を作成して実行する
このガイドでは、Kysely に組み込まれているMigrator と FileMigrationProvider を使用します。これらはコアの kysely パッケージに含まれています。別途提供されている kysely-ctl CLI の使用は任意で、同じ Migrator をラップしたものです。
移行ファイルを作成します。Kysely はファイル名の英数字順に移行を実行するため、ファイル名の先頭には日付をプレフィックスとして付けてください。
migrations/2026-09-30_create_todo.mts
src/migrate.mts を作成します。Kysely 0.29 では、Migrator と FileMigrationProvider を kysely/migration からインポートします。
src/migrate.mts
kysely_migration テーブルに記録するため、コマンドを再度実行しても何も変更されません。
データベースにクエリを実行する
Kysely を使って ToDo の作成・読み取り・更新・削除を行う小規模な HTTP サーバーsrc/server.mts を作成します。既存のアプリケーションでは、同じクエリを独自のルートハンドラー内でそのまま使用できます。
src/server.mts
Database インターフェイスに照らして検査されるため、テーブル名やカラム名のスペルミスや、必須の title を含まない挿入は型チェックでエラーになります。プロジェクトをチェックします:
動作確認
サーバーを起動します:npm start で独自のアプリが起動する既存のアプリの場合は、代わりに node --env-file=.env src/server.mts でサンプルサーバーを起動してください。
別の端末で、to-do をいくつか作成、更新、削除します。
guide_kysely と public スキーマを展開して、todo テーブルをクリックします。Kysely が作成した kysely_migration テーブルと kysely_migration_lock テーブルも、その横に表示されます。
次のステップ
- 接続: 接続文字列、PgBouncer、TLS について説明します。
- 設定:
max_connectionsなど、PostgreSQL および PgBouncer のパラメータを調整します。 - 読み取りレプリカ: 読み取り負荷の高いワークロードをスケールさせます。
- Kysely ドキュメント: 結合、トランザクション、型生成について説明しています。