Kysely 用于 TypeScript:完整指南及示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Kysely 用于 TypeScript:type-safe SQL 查询构建器完整指南

\n\n

1. 这是什么以及为什么需要它

\n\n

Kysely(发音为“ki-se-li”)是一个用于 TypeScript 和 Node.js 的现代、type-safe SQL 查询构建器,它允许您在从查询构建到结果获取的各个阶段编写具有完整类型支持的 SQL 查询。与传统的 ORM(对象关系映射,如 TypeORM 或 Prisma)不同,Kysely 并不抽象 SQL,而是提供方便的 API 来编写 SQL,同时保持对生成查询的完全控制。这意味着您可以使用 SQL 的全部功能(JOIN、子查询、窗口函数、CTE),而无需与 ORM 的限制作斗争。

\n\n

Kysely 解决的主要问题是 SQL 查询中的类型安全性。在普通的 JavaScript/TypeScript 代码中,SQL 查询通常以字符串形式编写,这会导致运行时错误:列名拼写错误、数据类型不匹配、错误的 JOIN。Kysely 在编译层面解决了这个问题:如果您尝试访问不存在的列或传递错误的数据类型,TypeScript 会在应用程序启动之前就报错。这大大减少了调试时间并提高了代码的可靠性。

\n\n

Kysely 非常适合需要最大性能和 SQL 控制,同时又希望享受静态类型化所有优势的项目。它支持 PostgreSQL、MySQL、SQLite 和 MSSQL,具有内置的 SQL 注入防护(通过参数化查询),支持迁移以及从现有数据库模式生成类型。该库正在积极开发中,拥有良好的文档和社区。

\n\n

2. 安装

\n\n

Kysely 的安装通过 npm(或 yarn/pnpm)完成。您需要安装库本身以及数据库的驱动程序。

\n\n
# 主包\nnpm install kysely\n\n# 对于 PostgreSQL\nnpm install pg\n\n# 对于 MySQL\nnpm install mysql2\n\n# 对于 SQLite\nnpm install better-sqlite3\n\n# 对于 MSSQL\nnpm install tedious\n
\n\n

如果您使用 TypeScript,请确保已安装驱动程序的类型(通常它们已包含在内)。为了获得更好的开发体验,建议同时安装 ts-node 来运行 TypeScript 文件:

\n\n
npm install -D ts-node typescript @types/node\n
\n\n

要使用迁移功能,请额外安装:

\n\n
npm install -D @kysely/cli\n
\n\n

3. 快速入门 — 最小工作示例

\n\n

让我们创建一个简单的应用程序,它连接到 SQLite 数据库,创建一个用户表并执行一些查询。

\n\n

首先,为我们的数据库定义类型:

\n\n
// types.ts\nexport interface User {\n  id: number;\n  name: string;\n  email: string;\n  age: number | null;\n  created_at: Date;\n}\n\nexport interface Database {\n  users: User;\n  // 这里可以添加其他表\n}\n
\n\n

现在创建主应用程序:

\n\n
// index.ts\nimport { Kysely, SqliteDialect } from 'kysely';\nimport Database from 'better-sqlite3';\nimport type { Database as MyDatabase } from './types';\n\n// 创建 Kysely 实例\nconst db = new Kysely<MyDatabase>({\n  dialect: new SqliteDialect({\n    database: new Database('my_database.db'),\n  }),\n});\n\nasync function main() {\n  // 创建表(如果不存在)\n  await db.schema\n    .createTable('users')\n    .ifNotExists()\n    .addColumn('id', 'integer', (col) => col.primaryKey().autoIncrement())\n    .addColumn('name', 'varchar(255)', (col) => col.notNull())\n    .addColumn('email', 'varchar(255)', (col) => col.notNull().unique())\n    .addColumn('age', 'integer')\n    .addColumn('created_at                    

推荐