@arthurfiorette/prisma-kysely

中文文档
3.1.1发布于 2026/07/07MITES Module近 30 天下载 7.3万

从 Prisma 计划生成 Kysely 数据库类型

中文使用文档
文档目录10 节
  1. 设置
  2. 横幅配置
  3. 动机
  4. 配置
  5. Schema 分组
  6. PostgreSQL enum 阵列
  7. 每个字段类型覆盖
  8. 抓到他们了
  9. 捐款
  10. 喊叫声

Prisma Kysely


Hero image "Generate Kysely types directly from your Prisma schema"


你喜欢普里斯玛的迁徙流动 语言和DX,但不喜欢 prisma 客户端的限制? 您想要驾驭 SQL 的生电源 而不失去 TypeScript 类型系统的安全性 ?

输入 prisma-kysely来啊!

设置

  1. 安装 prisma-kysely 使用您选择的软件包管理器 :

    bun add prisma-kysely
    
  2. 替换您的默认客户端生成器 schema.prisma 包含下列文件:

    generator kysely {
        provider = "prisma-kysely"
    
        // Optionally provide a destination directory for the generated file
        // and a filename of your choice
        output = "../src/db"
        fileName = "types.ts"
        // Optionally generate runtime enums to a separate file
        enumFileName = "enums.ts"
        // Optionally add content at the start of generated files (imports, pragmas, comments, etc.)
        banner = "import type { Decimal } from 'decimal.js';"
        // For multi-line, use Prisma's triple-quoted string syntax (see below)
    }
    
  3. 运行 prisma migrate dev 或者说 prisma generate 并使用您新产生的 切入凯斯利的瞬间!

横幅配置

这个 banner 选项允许您在生成文件开始时添加自定义内容。 这对进口自定义类型和库特别有用:

generator kysely {
    provider = "prisma-kysely"
    output = "../src/db"
    fileName = "types.ts"

    // Add custom imports for libraries you need in generated types
    banner = """
import type { Decimal } from 'decimal.js';
import { Big } from 'big.js';
import * as moment from 'moment';
import { v4 as uuid } from 'uuid';
import type { SomeType } from './custom-types';
"""
}

这将生成一个以 :

import type { Decimal } from "decimal.js";
import { Big } from "big.js";
import * as moment from "moment";
import { v4 as uuid } from "uuid";
import type { SomeType } from "./custom-types";

import type { ColumnType } from "kysely";
// ... rest of generated types

动机

普里斯玛的迁移和计划定义工作流程不可否认是巨大的 prisma 客户端的类型安全性是顶级的, 但每次都会有一次 Prisma用户的生活 客户端变得有点过于有限 有时 我们只需要自己写多张桌子 加入并挤出多余的 表现出我们的应用。 Prisma 客户端提供了两个选项: 简化查询 API 或用原始 SQL 字符串全程输入, 牺牲类型 保证安全.

这是凯斯利发光的地方。 Kysely 提供了一个工具箱来写表达式, 带有完全自动补全的类型安全 SQL 查询。 不过Kysely的问题 说到计划定义和 移徙。 许多用户使用类似 Prisma 的定义 其数据库的结构,以及 kysely-codegen 来回顾一下他们 数据库.

这个包裹, prisma-kysely是一种比较综合和方便的方式 保持 Kysely 类型与 Prisma 计划同步。 做了个先决条件 更改您的计划文件, 它就像使用 普里斯玛自己的客户端.

我和Cloudflare的D1一起用这个组合几个月了 我的个人项目和Postgres的工作。 它是一个改变游戏,我 希望对你同样有用

配置

密钥说明默认
output将保存生成代码的目录
fileName生成文件的文件名types.ts
importExtension导入附件的扩展 。 例如: ".js" 或者说 ".ts"启用 "" 以不附带任何附件.""
enumFileName生成的enum 的文件名 。 使用此选项将生成同一文件中的enum和文件 。 忽略当 schemaGrouping 实值 "namespace" 或者说 "exports",其中分组输出拥有enum放置.
camelCase启用对 Kysely 骆驼Case 插件的支持false
exportWrappedTypes冰盖包裹的种类,例如: Selectable<Model> 也按 Kysely 文档。导出的类型遵循文件的命名惯例.false
banner要预留到生成文件开始的内容 。 适用于自定义进口,实用工具指令(例如, // @ts-nocheck),评论,或任何其他内容. 支持单行字符串或多行通过 Prisma 三引字符串(""" ... """) (中文(简体) ). 内容被逐字插入到文件的顶部 .
readOnlyIds用凯斯利的 GeneratedAlways 页:1 @id 字段带有默认值,防止插入并更新.false
enumArrayTypePrisma enum 阵列的控件生成类型 。 使用 "array" 当您的 PostgreSQL 驱动程序将 enum- array OID 切入数组时, 或 "string" 键入原始 pg 阵列文字,例如 {FOO,BAR}。 。 。 .array
[typename]TypeOverride允许您为任何 Prisma 类型覆盖生成的 TypeScript 类型 。 瞄准与节点不同的环境时有用( 如 WinterCG 兼容运行时使用 UInt8Arrays 而非缓冲器用于二进制类型等) 。 看看这个 配置验证符 用于完整选项列表.
dbTypeName允许您用所有表格覆盖导出类型DB
schemaGrouping控制策略组 使用 "none" 用于平面输出, "namespace" 用于单文件 export namespace Schema 输出,或 "exports" 发送 types/index.ts 外加再导出每个schema文件 export * as Schema from "./schema"。 。 。 .none
filterBySchema当使用多子计时,只包括指定子计的模型和元计.false
defaultSchema当使用多方案时,宣布哪些方案应保持未组合。 在命名空间模式中,它没有被包;在导出模式中,它留在索引文件中.'public'

Schema 分组

schemaGrouping 控制多镜像模型和谜团的组合.

与 schemaGrouping = "namespace",所有组图都保留在配置中 类型文件 :

export namespace Animals {
  export type Dog = {
    id: string;
  };
}

export type DB = {
  "animals.dogs": Animals.Dog;
};

与 schemaGrouping = "exports" 财务报告和审定财务报表 fileName = "types.ts",输出为写入 改为 types/index.ts 旁边有计划文件,例如 types/animals.ts数字 :

// types/index.ts
import type * as Animals from "./animals";

export * as Animals from "./animals";

export type DB = {
  "animals.dogs": Animals.Dog;
};
// types/animals.ts
export type Dog = {
  id: string;
};

如果 schema 文件导出在主命名空间 DB 旁边使自动完成吵闹 类型,更喜欢在 Prisma 和 DB 类型自行居住的单列坡设置 软件包。 从该软件包中导出您的应用程序只应导出主命名空间类型 消费.

PostgreSQL enum 阵列

PostgreSQL 驱动程序例如 pg 不自动解析用户定义的 enum 阵列 OID. 见 节点- pg- 类型# 56。 。 。 . 如果您的应用程序注册了 enum- array 解析器, 请保留默认值 enumArrayType = "array"。 。 。 . 否则就定了 enumArrayType = "string" 以匹配原始 pg 阵列文字.

安装 postgres-array 如果您使用下面的解析器。 登记解析器一次, 在运行读取阵列的查询前:

import { Kysely, PostgresDialect } from "kysely";
import pg from "pg";
import { parse as parsePostgresArray } from "postgres-array";

const pool = new pg.Pool({ connectionString: process.env.DATABASE_URL });

// Registers enum array types.
// https://github.com/brianc/node-pg-types/issues/56#issuecomment-323223477
{
  const { rows } = await pool.query<{ typarray: number | string }>(
    `
    select t.typarray
    from pg_type as t
    inner join pg_namespace as n on n.oid = t.typnamespace
    where n.nspname not in ('pg_catalog', 'information_schema', 'pg_toast')
      and t.typtype = 'e'
      and t.typarray is not null
      and t.typarray != 0
  `
  );

  for (const row of rows) {
    pg.types.setTypeParser(Number(row.typarray), (value) =>
      value ? parsePostgresArray(value) : value
    );
  }
}

const db = new Kysely<DB>({
  dialect: new PostgresDialect({ pool }),
});

每个字段类型覆盖

在某些情况下,您可能想要为特定字段覆盖一个类型。 这个 例如,用于将字符串类型限制于某些字节 数值。 要知道,虽然这当然不会带来任何运行时间 校正,而且在大多数情况下,无法保证与实际数据相匹配 数据库.

恕我直言,事情是这样的: 添加一个 @kyselyType(...) 声明 以三鞭划去 ///用于外地 括号里有你喜欢的类型.

model User {
  id          String @id
  name        String

  /// @kyselyType('member' | 'admin')
  role        String
}

括号可以包括任何有效的TS类型声明.

以上例子的产出如下:

export type User = {
  id: string;
  name: string;
  role: "member" | "owner";
};

抓到他们了

默认值

默认情况下 (没有双关语) Prisma 查询引擎使用基于 JS 的 某些默认值的执行,即: uuid() 财务报告和审定财务报表 cuid()这个 表示它们最终不会在数据库中被定义为默认值 最终对我们来说是没用的.

虽然Prisma确实提供了很好的解决方案 dbgenerated()。这允许我们使用任何有效的默认值表达式 我们的数据库支持:

model PostgresUser {
   id    String @id @default(dbgenerated("gen_random_uuid()"))
}

model SQLiteUser {
   id    String @id @default(dbgenerated("(uuid())"))
}

检查一下Prisma医生 信息输入.

捐款

OKG,你真的想贡献? 非常感谢! 🙇‍♂️

这是所有你需要做的(如果有东西不见了,告诉我... )

  1. 叉并拉出仓库
  2. 运行 bun install 财务报告和审定财务报表 bun dev 开始 tsc 在监视模式中.
  3. 更改源代码
  4. 通过创建测试您的更改 prisma/schema.prisma运行 bun prisma generate 并检查输出 prisma/types.ts。必须设置提供者 参考dev建筑如下:
    generator kysely {
        provider = "node ./dist/bin.js"
    }
    
  5. 创建拉动请求 ! 如果你的改变是合情合理的 我会尽力去审查 并迅速合并它们.

我不百分之百确定这一点 类型 地图 每一个方言都是正确的, 所以任何和所有的贡献 战线 非常感谢。 你遇到过或改进过的虫子也是一样 你可以考虑一下.

喊叫声

  • 如果我没有用Robin Blomberg的神奇作品 我就不会造这个图书馆 Kysely 密码源。为任何人 我全心全意推荐他的包裹.
  • 隐含的多对多表生成代码部分灵感来自和 部分被盗 prisma-dbml-generator。 。 。 . 多亏了他们!
  • 伊加尔·克勒巴诺夫(签名)@igalklebanov (英语))和约克·索尔贝格(英语:@jukul (英语)作为这个图书馆的 推特上的主要支持者!
  • Kysely的作者和维护者
+ Boyce-Codd gang unite! 💽

版本与发布记录

@arthurfiorette/prisma-kysely 共发布 8 个版本,首次发布于 2025/01/11;过去 12 个月发布了 1 个版本。

版本发布日期距今
3.1.1latest2026/07/074 个月前
2.2.02025/07/211.3 年前
2.1.02025/06/261.4 年前
2.0.12025/06/021.4 年前
2.0.02025/06/021.4 年前
1.10.12025/03/061.7 年前

关于 @arthurfiorette/prisma-kysely 的常见问题

@arthurfiorette/prisma-kysely 是什么?

从 Prisma 计划生成 Kysely 数据库类型

如何安装 @arthurfiorette/prisma-kysely?

在项目目录运行 npm install @arthurfiorette/prisma-kysely,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:prisma(>=7.0.0)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。它还提供命令行工具 prisma-kysely,可以用 npx prisma-kysely 直接运行。

@arthurfiorette/prisma-kysely 支持 TypeScript 吗?

该包的 package.json 没有声明类型入口。需要类型提示时,可以在 npm 上查找社区维护的 @types/arthurfiorette__prisma-kysely 是否存在。

@arthurfiorette/prisma-kysely 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@arthurfiorette/prisma-kysely 可以商用吗?

@arthurfiorette/prisma-kysely 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@arthurfiorette/prisma-kysely 的下载量有多少?

根据 npm 官方下载统计,@arthurfiorette/prisma-kysely 在 2026/10/07 – 2026/11/05 这 30 天内被下载 72,576 次,日均约 2,419 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@arthurfiorette/prisma-kysely 还在维护吗?

最新版本 3.1.1 发布于 2026/07/07(4 个月前);至今共发布 8 个版本,其中过去 12 个月发布了 1 个;首次发布于 2025/01/11。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。