ORM 为什么选择 Prismajs
优势
- 基于面向对象的查询接口,灵活且流畅,TS 类型推导非常严谨安全;
- 支持多种数据库,如 MySQL、PostgreSQL、CloudFlare D1、MongoDB 等,完美适应不同团队、项目的选型偏好,即使你没有 SQL 语法的使用经验;
- 清晰的数据模型定义 DSL、完整的迁移同步工具、丰富的文档与强大的社区;
- 支持 Cloudflare D1!
与 dirzzle 的对比
比较项目 | Prisma | Drizzle |
---|---|---|
定义方式 | - 使用 Prisma Schema(.prisma 文件)来定义数据模型,通过类似于 DSL(领域特定语言)的语法定义表、列、关系等。例如,可以直观地定义model User { id Int @id; name String; } 来表示User 表。 - 这种方式将数据库结构和业务逻辑中的数据模型进行了清晰的分离。 |
- 在代码中直接使用 JavaScript 或 TypeScript 来定义数据库架构,通常是通过函数调用和对象字面量的方式。 - 例如,在 Drizzle 中可能会定义一个表结构类似const usersTable = drizzle.schema.createTable("users", { columns: { id: int("id").primaryKey(), name: varchar("name") } }); 。 |
数据库迁移 | - Prisma 提供了一套完整的迁移工具,通过prisma migrate 命令。它可以自动生成迁移文件,并将数据库结构的变更应用到数据库中。 - 能够很好地跟踪数据库架构的变化历史,方便团队协作和在不同环境中同步数据库结构。 |
- Drizzle 的迁移相对来说更加灵活,它可以通过编写自定义的 SQL 脚本或者利用一些社区提供的轻量级迁移工具来实现数据库迁移。 - 这种方式对于熟悉 SQL 的开发者来说可能更加直观,但可能需要开发者自己处理更多的细节,比如版本控制和冲突解决。 |
查询构建 | - Prisma 提供了一种流畅的、面向对象的查询构建方式。例如,要查询用户列表可以这样写:const users = await prisma.user.findMany(); ,这种方式很符合 JavaScript/TypeScript 开发者的习惯。 - 支持复杂的关联查询,并且能够自动处理关系数据的加载和解析,通过include 和select 关键字等可以灵活控制查询的数据范围。 |
- Drizzle 的查询构建更接近 SQL 的思维方式,在代码中会看到更多 SQL 语法的影子。例如,const query = select().from(usersTable).where(eq(usersTable.id, 1)); 。 - 对于简单查询来说,它可能看起来比较简洁明了,但对于复杂的关联查询和嵌套查询,可能需要编写更多的代码来实现相同的功能。 |
类型安全 | - Prisma 在类型安全方面表现出色,它会根据定义的.prisma 文件自动生成类型定义文件(.d.ts ),在代码编辑器中能够提供很好的类型提示。 - 这使得在编写查询和处理数据时,能够及时发现类型不匹配等错误,减少运行时错误的发生。 |
- Drizzle 也注重类型安全,它通过使用 TypeScript 的类型系统,结合自身的类型定义,为数据库操作提供类型支持。 - 不过,由于其查询构建方式比较灵活,可能需要开发者更加仔细地定义和维护类型,以确保类型安全。 |
性能 | - Prisma 在性能方面做了很多优化,尤其是在处理大量数据和复杂查询时,它能够有效地利用数据库连接池,减少不必要的数据库请求。 - 不过,在一些特定场景下,如高度定制化的 SQL 查询或者对性能要求极高的场景,可能会受到其抽象层的限制。 | - Drizzle 由于其更接近底层 SQL 的操作方式,在性能优化方面可能具有一定的灵活性。开发者可以根据具体的性能需求编写更高效的 SQL 查询。 - 但是,这也意味着开发者需要对数据库性能优化有更深入的了解,并且在代码维护过程中需要更加注意性能问题。 |
生态系统和社区支持 | - Prisma 拥有较大的社区和丰富的文档资源,许多流行的框架和工具都有与之集成的案例和插件。 - 这使得在遇到问题时,更容易找到解决方案,并且可以方便地与其他技术栈进行整合。 | - Drizzle 相对来说是一个较新的工具,社区规模较小,但正在逐渐发展壮大。 - 文档资源也在不断完善,在一些新兴的技术栈或者对灵活性要求较高的项目中开始得到应用。 |
Prisma usefull tips
以下是 Prisma 的使用场景,感受以下 Prisma 的便捷性:
- 关联数据创建场景:初始化项目以及项目的管理员
const project = await prisma.project.create({
data: {
title: 'default project',
owner: {
create: {
username: '管理员'
}
}
}
})
- 关联查询场景:查询项目详情并关联出管理员信息
// 关联查询
function getProject(id: string) {
return prisma.project.findUnique({
where: {
id
},
include: {
owner: true,
}
})
}
Cloudflare D1 支持
- Cloudlfare D1 提供足够的免费额度,开发者也不需要为数据库的运维费心思
- 基于 sqlite 的 D1 数据类型支持的不多,比如无法支持枚举类型
使用 zod-prisma 自动生成校验文件
- 安装
zod-prisma
; - 配置 schema.prisma 文件;
generator zod {
provider = "zod-prisma"
output = "./zods"
}
- 运行 prisma generate 时,会自动根据数据库的定义生成 zod 文件;