用途
Kysely 是一个类型安全的 TypeScript SQL 查询构建器,提供从数据库 schema 到查询结果的端到端类型安全。与 ORM 不同,它生成原生 SQL,在保持完美 TypeScript 推断的同时让你完全掌控 SQL。
主要能力
- 完整类型推断(schema → 查询 → 结果)
- 零运行时开销(编译为 SQL)
- 数据库无关(PostgreSQL、MySQL、SQLite、MSSQL)
- 内置迁移系统
- 插件生态(CTE、JSON、地理空间)
- 需要时可集成原生 SQL
安装
npm install kysely
# Database driver (choose one)
npm install pg # PostgreSQL
npm install mysql2 # MySQL
npm install better-sqlite3 # SQLite
使用方式
1. 定义数据库 Schema 类型
使用 Generated、Selectable、Insertable、Updateable 等类型定义表接口与数据库接口,并派生出查询结果类型。
2. 创建数据库实例
通过 Kysely 与对应方言(如 PostgresDialect)以及连接池(如 pg 的 Pool)创建实例。
3. 类型安全查询
支持 SELECT、INSERT、UPDATE、DELETE,均带完整类型推断。例如 db.selectFrom('users').select([...]).where(...).execute() 返回精确类型数组;insertInto(...).values(...).returningAll().executeTakeFirstOrThrow() 返回对应行类型。
高级查询模式
- 连接:
innerJoin、leftJoin(LEFT JOIN 字段类型自动含 null)、多表连接 - 聚合与分组:
db.fn.count、db.fn.avg、groupBy、having,以及sql模板标签写复杂聚合 - 子查询:标量子查询、
eb.exists、IN子查询 - CTE:
with与withRecursive(递归 CTE,如组织层级)
从数据库生成 Schema
使用 kysely-codegen:
npm install --save-dev kysely-codegen
npx kysely-codegen --url "postgresql://user:pass@localhost:5432/mydb"
支持自定义类型映射(如 timestamp、jsonb、numeric、uuid),通过 ColumnType 分别指定 SELECT、INSERT、UPDATE 类型。
迁移
通过 Migrator 与 FileMigrationProvider 配置迁移,migrateToLatest 执行全部待处理迁移,migrateDown 回滚。迁移文件导出 up 与 down,使用 db.schema 创建表、索引、外键、修改列,也可用 sql 执行枚举类型等原生语句。
事务
db.transaction().execute(async (trx) => {...}) 出错自动回滚;支持手动控制与隔离级别设置(如 read committed、serializable)。
原生 SQL 集成
使用 sql 模板标签在 SELECT、WHERE 中嵌入原生 SQL,或执行完整原生查询与参数化查询。
插件生态
- PostgreSQL JSON:
jsonBuildObject、jsonArrayFrom - 分页:自定义
paginate辅助函数,可配合总数统计 - 全文搜索(PostgreSQL):GIN 索引与
to_tsquery查询
适用场景
- 偏好 SQL 优先、需要复杂查询
- 需要类型安全 schema
- 需要快速原型开发(对比中提及)
限制
- 仅为查询构建器,不含完整 ORM 特性
- 学习曲线中等(需要 SQL 知识)
- 代码生成可选
与 Drizzle、Prisma 对比(资料提供)
| 特性 | Kysely | Drizzle | Prisma |
|---|---|---|---|
| 类型安全 | 完整(schema → 查询) | 完整(schema → 查询) | 完整(生成客户端) |
| SQL 控制 | 原生 SQL 友好 | 原生 SQL 友好 | 有限 |
| 打包体积 | ~50kB | ~30kB | ~500kB+ |
| 迁移系统 | 内置 | 内置 | 强大 CLI |
| 查询性能 | 原生 SQL | 原生 SQL | 较慢(抽象层) |
| Schema 定义 | TypeScript 类型 | TypeScript schema | Prisma schema |
| 是否需要代码生成 | 可选 | 否 | 是 |
| ORM 特性 | 仅查询构建器 | 部分(关系) | 完整 ORM |
| 学习曲线 | 中等(需 SQL 知识) | 中等 | 简单(抽象 SQL) |
| 最适合 | SQL 优先、复杂查询 | 类型安全 schema | 快速原型 |
何时选择 Kysely
资料中该部分内容不完整(原文止于“You know SQL a”),暂未提供完整结论。