首页
/ Kysely 数据库查询构建器入门指南

Kysely 数据库查询构建器入门指南

2025-07-06 04:13:16作者:盛欣凯Ernestine

Kysely 是一个类型安全的 SQL 查询构建器,专为 TypeScript 设计。它提供了优雅的 API 来构建和执行 SQL 查询,同时保持完整的类型安全。本文将带你从零开始学习如何使用 Kysely。

为什么选择 Kysely?

在开始之前,让我们先了解 Kysely 的几个关键优势:

  1. 完全类型安全:所有查询都经过 TypeScript 类型检查
  2. 自动补全:IDE 可以智能提示表和列名
  3. 可组合性:查询可以像乐高积木一样组合和复用
  4. 多数据库支持:支持 PostgreSQL、MySQL 和 SQLite

准备工作

在开始使用 Kysely 前,请确保你的开发环境满足以下要求:

  • Node.js 14 或更高版本
  • TypeScript 4.5 或更高版本
  • 已安装数据库驱动(根据你使用的数据库选择)

安装 Kysely

使用你喜欢的包管理器安装 Kysely 核心包:

npm install kysely

然后根据你使用的数据库安装对应的方言包:

# PostgreSQL
npm install pg

# MySQL
npm install mysql2

# SQLite
npm install better-sqlite3

类型定义

Kysely 的核心特性是类型安全。你需要先定义数据库模式,这样 TypeScript 就能在编译时检查你的查询。

interface Database {
  person: {
    id: Generated<number>
    name: string
    age: number
  }
  pet: {
    id: Generated<number>
    name: string
    owner_id: number
    species: 'dog' | 'cat'
  }
}

初始化 Kysely 实例

创建 Kysely 实例需要配置数据库连接和方言:

import { Kysely, PostgresDialect } from 'kysely'
import { Pool } from 'pg'

const db = new Kysely<Database>({
  dialect: new PostgresDialect({
    pool: new Pool({
      host: 'localhost',
      database: 'test',
      user: 'user',
      password: 'password'
    })
  })
})

执行查询

Kysely 提供了链式 API 来构建查询:

查询所有用户

const people = await db
  .selectFrom('person')
  .select(['id', 'name'])
  .execute()

带条件的查询

const adults = await db
  .selectFrom('person')
  .selectAll()
  .where('age', '>=', 18)
  .execute()

连接查询

const petsWithOwners = await db
  .selectFrom('pet')
  .innerJoin('person', 'person.id', 'pet.owner_id')
  .select(['pet.name as petName', 'person.name as ownerName'])
  .execute()

增删改操作

插入数据

await db
  .insertInto('person')
  .values({ name: 'John', age: 30 })
  .execute()

更新数据

await db
  .updateTable('person')
  .set({ age: 31 })
  .where('name', '=', 'John')
  .execute()

删除数据

await db
  .deleteFrom('person')
  .where('age', '>', 100)
  .execute()

事务处理

Kysely 提供了简单的事务 API:

await db.transaction().execute(async (trx) => {
  await trx
    .insertInto('person')
    .values({ name: 'Alice', age: 25 })
    .execute()

  await trx
    .insertInto('pet')
    .values({ name: 'Fluffy', owner_id: 1, species: 'cat' })
    .execute()
})

总结

通过本文,你已经学会了:

  1. 如何安装和配置 Kysely
  2. 如何定义数据库模式类型
  3. 如何执行基本查询和复杂连接
  4. 如何进行增删改操作
  5. 如何使用事务

Kysely 的强大之处在于它将 SQL 的表达力与 TypeScript 的类型安全完美结合。随着你对 Kysely 的深入使用,你会发现它能够显著提高数据库操作的开发效率和代码质量。