pg 驱动程序,在启用 TLS 证书验证的情况下将 Kysely 连接到 ClickHouse Managed Postgres,借助 Kysely 迁移创建表,并用 Node.js 搭建一个小型待办事项 API。
前置条件
- Node.js 22.18 或更高版本,可直接运行 TypeScript 文件,无需构建步骤。本指南中的文件使用
.mts扩展名,因此无论是 CommonJS 项目还是 ES 模块项目,Node.js 都会将其视为 ES 模块。 - 一个 ClickHouse Cloud 账户。
psql,用于创建数据库。也可以在 SQL 控制台中运行CREATE DATABASE语句。curl,用于调用 API。
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) ,然后复制该连接字符串。
本指南直接连接到 Postgres 的 5432 端口,原因有二:
- Node.js 服务器是长期运行的进程。
pg的Pool本身就会保持少量连接处于打开状态并加以复用,因此服务端连接池器带来的收益不大。 - Kysely 的
Migrator在执行迁移期间会持有一个会话级咨询锁 (pg_advisory_lock) 。PgBouncer 以事务池模式运行,因此获取锁、执行迁移和释放锁这几步操作可能分别落在不同的后端连接上。如果经由 PgBouncer 连接,该锁可能会一直被某个池化连接持有,导致后续的迁移因等待该锁而阻塞。
6432) 。由于 pg 默认使用未命名的预处理语句,Kysely 搭配 pg 可以在事务池模式下正常工作。但迁移仍应通过 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 时,工作目录即为项目根目录。
添加 tsconfig.json,让 tsc 对 Node.js 所运行的文件执行类型检查。如果您的应用已有 tsconfig.json,请将以下 compilerOptions 和 migrations 文件夹合并到其中:
tsconfig.json
定义数据库接口
Kysely 依据一个描述各个表的接口,为每个查询推断类型。创建src/db.mts,在其中定义该接口,并创建一个 Kysely 实例,该实例使用搭配 pg Pool 的 PostgresDialect:
src/db.mts
Generated 用于标记由数据库自动填充的列,因此插入时可以省略这些列。
创建并运行迁移
本指南使用 Kysely 内置的Migrator 和 FileMigrationProvider,二者均包含在核心 kysely 包中。独立的 kysely-ctl 命令行客户端是可选的,它封装的也是同一个 Migrator。
创建一个迁移文件。Kysely 会按文件名的字母数字顺序依次运行迁移,因此请以日期作为文件名前缀:
migrations/2026-09-30_create_todo.mts
src/migrate.mts,用于执行所有待处理的迁移。在 Kysely 0.29 中,需从 kysely/migration 导入 Migrator 和 FileMigrationProvider:
src/migrate.mts
kysely_migration 表中记录已应用的迁移,因此再次运行该命令不会有任何效果。
查询数据库
创建src/server.mts,这是一个小型 HTTP 服务器,使用 Kysely 对待办事项执行增删改查操作。如果是现有应用,你可以在自己的路由处理程序中使用相同的查询:
src/server.mts
Database 接口进行校验,因此一旦表名或列名拼写错误,或插入时缺少必填的 title,类型检查都会失败。对项目进行检查:
验证
启动服务器:npm start 运行的是你自己的应用,因此请改用 node --env-file=.env src/server.mts 来启动示例服务器。
在另一个终端中,创建、更新和删除几条待办事项:
guide_kysely 和 public schema,然后点击 todo 表。Kysely 创建的 kysely_migration 和 kysely_migration_lock 表也会一并列在旁边: