在 Node.js 和 TypeScript 中访问数据库可能会感到脆弱和痛苦。Prisma 通过一个为你的数据量身定制的自动生成且类型安全的查询构建器消除了这种痛苦!试试看!
目录
问题:使用数据库很困难
现有的数据库访问库格局范围从发送原始 SQL 字符串到更高级别的抽象,如 SQL 查询构建器和 ORM。这些方法中的每一种都有自己的问题和陷阱。总的来说,对于在 Node.js 和 TypeScript 中使用数据库的应用程序开发人员来说,缺乏最佳实践。
现有工具的丛林和缺乏最佳实践导致了两个主要后果
- 开发人员不高效,因为现有工具不适合他们的需求
- 开发人员不确信他们正在做“正确的事情”
解决方案:Prisma 使数据库变得容易
Prisma 是一个开源数据库工具包。它取代了传统的 ORM,并使用为 Node.js 和 TypeScript 自动生成且类型安全的查询构建器使数据库访问变得容易。
Prisma 目前支持 PostgreSQL、MySQL 和 SQLite 数据库——并且计划支持更多数据库。如果您希望看到对特定数据库的支持,请创建新的 GitHub 问题或订阅现有问题(例如,对于MongoDB 或 DynamoDB)。
在运行 Prisma 2.0 的预览版和 Beta 版近一年并收集了我们社区的大量有益反馈后,我们很高兴推出 Prisma Client 的正式版 🎉
Prisma Client:适用于 Node.js 和 TypeScript 的现代数据库访问
Prisma Client 为开发人员提供了一种全新的数据库访问方式,其主要目标有两个
- 通过让开发人员以自然和熟悉的方式查询数据来提高生产力
- 通过类型安全、自动完成和强大的查询 API 来提高信心
Prisma Client 如何提高生产力和提升信心
在本节中,我们将更仔细地研究 Prisma Client 如何使开发人员能够更快地构建应用程序,同时编写更具弹性和健壮性的代码。
以下是你从 Prisma Client 获得的好处概述
以对象思考:自然而熟悉的查询 API
Prisma Client 的最大好处之一是它提供的抽象级别。它允许开发人员以对象(而不是 SQL)来思考他们的数据,从而减少了将关系数据映射到面向对象数据的认知和实际开销。
尽管 Prisma Client 将数据作为对象返回,但它不是 ORM,因此不会受到对象关系阻抗失配通常引起的常见问题的影响。
Prisma 不会将类映射到表,并且没有复杂的模型实例或隐藏的性能陷阱(例如,由于延迟加载),这在传统的 ORM 中经常看到。Prisma Client 为你的数据库模式提供了一个查询 API,重点关注结构类型和自然查询(从这个意义上说,它最接近传统 ORM 的数据映射器模式)。
例如,假设你有这些 User
和 Post
表
使用 Prisma Client,你可以编写如下查询来读取和写入这些表中的数据
正如你所见,生成的 postsByAuthor
包含一个普通 JavaScript 对象数组(如果你正在使用 TypeScript,这些对象将是强类型的)。
注意:
author
字段是一个虚拟的关系字段,它在 Prisma Client API 中将Post
连接到User
表。由于它没有直接在数据库中表示,因此可以以你喜欢的任何方式命名。
你还可以轻松地包含模型的关系,在这种情况下,你还可以检索有关返回帖子的“作者”的信息
再次注意,当你使用 TypeScript 时,postsByAuthorWithAuthorInfo
中的对象是完全类型化的,因此访问帖子 author
上不存在的属性,在这种情况下,将引发编译器错误。
直观地处理关系
访问相关数据(意味着来自通过外键连接的表的数据)对于现有数据库工具来说可能特别棘手。这主要是由于关系数据库和面向对象语言中表示这些关系的方式存在根本不匹配
Prisma Client 允许你直观地读取和写入嵌套数据
再次注意,在上述所有情况下,如果你正在使用 TypeScript,则 result
将是完全类型化的!
声明式且人类可读的数据库模式
使用 SQL 读取表和其他数据库结构的定义(例如,CREATE TABLE User
、ALTER TABLE User ADD COLUMN email
)可能会让人感到杂乱。Prisma 引入了数据库模式的声明式版本,称为Prisma 模式。
Prisma 模式是通过内省你的数据库生成的,并作为 Prisma Client 查询 API 的基础。例如,这是上面 User
和 Post
定义的等效版本
注意: 我们也在开发一个名为 Prisma Migrate 的数据库迁移工具。使用 Prisma Migrate,基于内省的工作流程 被“反转”,您可以将声明式的 Prisma 模式映射到数据库;Prisma Migrate 将生成所需的 SQL 语句并针对数据库执行这些语句。
数据库查询的自动补全
自动补全是一项极其强大的功能,它使开发人员能够在编辑器中浏览 API,而不是查找参考文档。由于 Prisma Client 是从您的数据库模式生成的,因此查询 API 会让您感觉非常熟悉。
自动补全的可用性在很大程度上提高了生产力,因为您可以“在使用 API 时学习它”。自动补全还增加了信心,因为您可以确信建议的 API 操作将有效。
完全类型安全的数据库查询
Prisma Client 保证所有数据库查询的完全类型安全,即使只检索模型属性的子集,或者使用 include
加载关系也是如此。
再次考虑之前的示例中的 User
和 Post
表,Prisma 会生成以下 TypeScript 类型来表示应用程序中这些表的数据
Prisma Client 发送的任何普通 CRUD 查询都将返回相应类型的对象响应。但是,再次考虑上面的查询,其中使用了 include
来获取关系
postsByAuthorWithAuthorInfo
中的对象与生成的 Post
类型不匹配,因为它们带有额外的 author
对象。在这种情况下,Prisma Client 仍然提供完全的类型安全,并且能够静态地键入结果!以下是类型的外观
正因如此,TypeScript 编译器会捕获您正在访问不存在的属性的情况。例如,这将是非法的
数据库和应用程序模型的单一事实来源
数据库工具经常需要同步在应用程序代码和数据库之间对数据模型所做的更改。例如,在更改数据库表后,开发人员通常需要手动调整其应用程序代码中相应的模型,并扫描代码库中对该表的使用情况以进行更新。
这使得数据库模式迁移和代码重构变得可怕,因为无法保证在更改后两层保持同步!
Prisma Client 采用不同的方法来解决此问题。Prisma Client 的查询 API 不是手动同步应用程序代码和数据库之间的更改,而是基于您的数据库模式生成的。
使用这种方法,您可以在数据库模式更改后简单地重新生成 Prisma Client,并且更改将自动同步到您的 Prisma Client 查询 API。由于自动补全和类型安全,将您的应用程序代码更新为新的查询将比任何其他方法快得多。
您可以使用 Prisma 构建什么
Prisma 的主要用例是构建需要在数据库中持久保存数据的服务器端应用程序。
自 Prisma 2.0 的预览阶段以来,我们已经看到开发人员构建了各种各样的应用程序,从社交网络应用程序到电子商务商店,再到生产力工具和市场。我们很高兴看到您使用 Prisma 构建什么!
这是我职业生涯中最快的开发速度。Prisma 大大缩短了实施时间,同时增加了我对代码的信心。我也能够对许多新的增量功能说“是”;现在,实现过去需要两到三天的时间只需半天即可。
REST、GraphQL、Thrift、gRPC 等
服务器端应用程序通常公开一个 API,该 API 由前端(例如 Web 或移动端)或其他应用程序使用。Prisma Client 与所有现有的 API 技术兼容,例如 REST、GraphQL、Thrift 或 gRPC。
Prisma 适用于各种部署模型
Prisma Client 可用于传统的单体服务器、微服务架构和无服务器部署。阅读有关 部署 的文档页面以了解更多信息。
围绕 Prisma 发展的强大生态系统
尽管 Prisma 还很年轻,但我们对正在出现的生态系统和我们看到围绕它发展的各种工具感到非常自豪和兴奋。
下一代全栈框架基于 Prisma
Node.js 生态系统以许多不同的框架而闻名,这些框架试图简化工作流程并规定某些约定。我们非常荣幸许多框架作者决定使用 Prisma 作为他们选择的数据层。
GitHub 联合创始人 Tom Preston-Werner 的新 RedwoodJS 框架旨在成为 Node.js 的“Ruby on Rails”等价物。RedwoodJS 基于 React 和 GraphQL,并带有用于无服务器函数的内置部署模型。
社区中另一个越来越受期待和兴奋的框架是 Blitz.js。Blitz 构建在 Next.js 之上,并采用了与 Redwood 根本不同的方法。它的目标是完全消除 API 服务器,并 “恢复服务器渲染框架的简洁性”。
使用 Nexus 和 Prisma 插件构建类型安全的 GraphQL 服务器
在 Prisma,我们是 GraphQL 的忠实拥护者,并相信它光明的未来。这就是为什么我们成立了 Prisma Labs 团队,该团队致力于研究 GraphQL 生态系统中的开源工具。
它目前专注于构建 Nexus,这是一个用于开发 GraphQL 服务器的令人愉悦的应用程序框架。与 Redwood 不同,Nexus 是一个仅后端 GraphQL 框架,对您如何从前端访问 GraphQL API 没有意见。
使用 Nexus 的 Prisma 插件,您可以在 GraphQL API 中公开 Prisma 模型,而无需实现将 GraphQL 解析器连接到数据库时所需的典型 CRUD 样板。
多亏了该插件,几乎不需要任何样板即可公开完整的 CRUD 操作,包括 Prisma 模型的过滤器、分页和排序功能。
Prisma 入门
有多种方法可以开始使用 Prisma
了解如何针对演示发送使用 Prisma Client 的数据库查询 SQLite 数据库 – 无需设置!
非常感谢我们的社区 💚
我们对 3 月份 Beta 发布的积极回应感到非常高兴,并很高兴今天与大家分享正式发布!非常感谢一路陪伴我们的每一个人!
在 Slack 和 awesome-prisma
上分享您正在构建的内容
如果您是 Prisma 的新手,我们很乐意在我们的 Slack 中见到您!如果您已经在使用 Prisma,请在 #showcase
频道中发布您构建的内容,让大家知道。
我们为我们创建了许多关于 Prisma 的精彩文章和视频的内容创作者社区感到自豪!有关最佳 Prisma 资源的概述,请查看 awesome-prisma
存储库。别忘了创建 PR,其中包含任何缺少的内容!
一些亮点包括
- Dimitri Ivashchuk 的 egghead 视频系列
- Lee Robinson 关于使用 Prisma 和 Next.js 的教程(包括 视频)
- Marc Julian 和 朋友的 Nest.js 入门工具包。
参加 6 月 25 日和 26 日的 Prisma Day,参加研讨会和讲座
在去年成功首映之后,我们很高兴在 6 月 25 日(研讨会)和 26 日(讲座)举办另一届 Prisma Day。
今年,我们将进行远程直播,并邀请大家加入我们,围绕现代应用程序开发、数据库工作流的最佳实践以及 Prisma 的一切进行精彩的讲座!
不要错过下一篇文章!
注册 Prisma 新闻稿