

你喜欢普里斯玛的迁徙流动 语言和DX,但不喜欢 prisma 客户端的限制? 您想要驾驭 SQL 的生电源 而不失去 TypeScript 类型系统的安全性 ?
输入 prisma-kysely来啊!
设置
-
安装
prisma-kysely使用您选择的软件包管理器 :bun add prisma-kysely -
替换您的默认客户端生成器
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) } -
运行
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 |
enumArrayType | Prisma 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())"))
}
捐款
OKG,你真的想贡献? 非常感谢! 🙇♂️
这是所有你需要做的(如果有东西不见了,告诉我... )
- 叉并拉出仓库
- 运行
bun install财务报告和审定财务报表bun dev开始tsc在监视模式中. - 更改源代码
- 通过创建测试您的更改
prisma/schema.prisma运行bun prisma generate并检查输出prisma/types.ts。必须设置提供者 参考dev建筑如下:generator kysely { provider = "node ./dist/bin.js" } - 创建拉动请求 ! 如果你的改变是合情合理的 我会尽力去审查 并迅速合并它们.
我不百分之百确定这一点 类型 地图 每一个方言都是正确的, 所以任何和所有的贡献 战线 非常感谢。 你遇到过或改进过的虫子也是一样 你可以考虑一下.
喊叫声
- 如果我没有用Robin Blomberg的神奇作品 我就不会造这个图书馆 Kysely 密码源。为任何人 我全心全意推荐他的包裹.
- 隐含的多对多表生成代码部分灵感来自和
部分被盗
prisma-dbml-generator。 。 。 . 多亏了他们! - 伊加尔·克勒巴诺夫(签名)@igalklebanov (英语))和约克·索尔贝格(英语:@jukul (英语)作为这个图书馆的 推特上的主要支持者!
- Kysely的作者和维护者
+ Boyce-Codd gang unite! 💽