Prisma 2.0:让您的数据库充满信心,提高工作效率

2020-06-09 22:51:30

现有的数据库访问库范围从发送原始SQL字符串到更高级别的抽象(如SQL查询构建器和ORM)。这些方法中的每一种都有自己的问题和陷阱。总体而言,在Node.js和TypeScript中使用数据库的应用程序开发人员缺乏最佳实践。

Prisma是一个开源数据库工具包。它取代了传统的ORM,并使用针对Node.js和TypeScript的自动生成的、类型安全的查询构建器简化了数据库访问。

Prisma目前支持PostgreSQL、MySQL和SQLite数据库-还有更多计划中的数据库。如果您想查看对特定数据库的支持,请创建新的GitHub版本或订阅现有版本(例如MongoDB或DynamoDB)。

在运行了Prisma2.0的预览版和测试版将近一年之后,并从我们的社区收集了大量有用的反馈,我们很高兴能够推出Prisma Client for General Availability🎉。

Prisma Client为开发人员提供了一种全新的访问数据库的方式,并且牢记两个主要目标:

在本节中,我们将更仔细地了解Prisma Client如何使开发人员能够更快地构建应用程序,同时编写更具弹性和健壮性的代码。

Prisma客户端的最大好处之一是它提供的抽象级别。它允许开发人员在对象(而不是SQL)中考虑他们的数据,减少了将关系数据映射到面向对象数据的认知和实际开销。

虽然Prisma客户端将数据作为对象返回,但它不是ORM,因此不会受到对象关系阻抗不匹配经常导致的常见问题的困扰。

Prisma不会将类映射到表,也不会像传统ORM中经常看到的那样,存在复杂的模型实例或隐藏的性能陷阱(例如,由于延迟加载)。Prisma客户端为您的数据库模式提供了一个查询API,重点放在结构类型和自然查询上(从这个意义上说,它最接近传统ORM的数据映射器模式)。

使用Prisma Client,您可以制定如下查询来读取和写入这些表中的数据:

如您所见,生成的postsByAuthor包含一个纯JavaScript对象数组(如果您正在使用typecript,这些对象将是强类型的)。您还可以轻松地包括模型的关系,在这种情况下,您还可以检索关于返回帖子的";作者";的信息:

const postsByAuthorWithAuthorInfo=等待Prisma.post。findMany({where:{Author:{id:42}},include:{Author:true,}})。

再次注意,在使用TypeScript时,postsByAuthorWithAuthorInfo中的对象是完全类型化的,因此访问POST作者的不存在属性(在本例中)将引发编译器错误。

使用现有数据库工具访问相关数据(即通过外键连接的表中的数据)可能特别棘手。这主要是由于这些关系在关系数据库和面向对象语言中的表示方式根本不匹配:

关系:数据通常是标准化(平面)的,并使用外键跨实体进行链接。然后需要联接这些实体以显示实际的关系。

面向对象:对象可以是深度嵌套的结构,您只需使用点符号就可以遍历关系。

const result=等待Prisma.user。findMany({include:{post:{select:{id:true,title:true})。

再次注意,在上述所有情况下,如果您使用的是TypeScript!

使用SQL(例如CREATE TABLE USER、ALTER TABLE USER ADD COLUMN EMAIL)读取表和其他数据库结构的定义可能会。Prisma引入了称为Prisma模式的数据库模式的声明性版本。

Prisma模式是通过自省数据库生成的,它是Prisma客户端查询API的基础。例如,这是上述用户和发布定义的等效版本:

model{id Int@default(autoincremental())@id电子邮件字符串@唯一名称字符串?Posts Post[]}model{id Int@default(autoincremental())@id标题字符串内容字符串?Author User@Relationship(字段:[Author ID],引用:[ID])Author ID Int}。

注意:我们还在开发一个名为Prisma Migrate的数据库迁移工具。使用Prisma Migrate,基于自省的工作流被颠倒,您可以将声明性Prisma架构映射到数据库;Prisma Migrate将生成所需的SQL语句,并针对数据库执行这些语句。

自动完成是一个非常强大的功能,它使开发人员能够在其编辑器中探索API,而不是查找参考文档。因为Prisma客户机是从您的数据库模式生成的,所以您会对查询API感到非常熟悉。

拥有自动完成功能在很大程度上有助于提高工作效率,因为您可以边使用边学习API。自动完成功能还可以增强您的信心,因为您可以确保建议的API操作能够正常工作。

Prisma客户端保证所有数据库查询的完全类型安全,即使只检索模型属性的子集或使用include加载关系也是如此。

再次考虑前面示例中的USER和POST表,PRISMA生成以下类型的文字脚本来表示应用程序中这些表的数据:

类型user={id:number email:string name:string|null}类型Post={id:number AuthId:number|null title:string|null content:string|null}。

Prisma客户端发送的任何纯CRUD查询都将返回相应键入的对象的响应。但是,再次考虑上面的查询,其中使用include来获取关系:

const postsByAuthorWithAuthorInfo=等待Prisma.post。findMany({where:{Author:{id:42}},include:{Author:true,}})。

postsByAuthorWithAuthorInfo中的对象与生成的Post类型不匹配,因为它们携带附加的Author对象。在这种情况下,Prisma客户端仍然提供完全的类型安全,并且能够静态键入结果!以下是该类型的外观:

多亏了这一点,TypeScript编译器将捕捉您再次访问不存在的属性的情况。例如,这将是非法的:

数据库工具通常存在需要在应用程序代码和数据库之间同步对数据模型所做的更改的问题。例如,在更改数据库表之后,开发人员通常需要在其应用程序代码中手动调整各自的模型,并扫描代码库以查找表的用法以更新它。

这使得数据库模式迁移和代码重构变得可怕,因为不能保证这两个层在更改后保持同步!

Prisma客户端对此问题采取了不同的方法。Prisma客户端的查询API是基于您的数据库架构生成的,而不是手动同步应用程序代码和数据库之间的更改。

使用这种方法,您只需在数据库模式更改后重新生成Prisma客户端,更改将自动同步到您的Prisma客户端查询API。多亏了自动完成和类型安全,将应用程序代码更新为新查询比使用任何其他方法都要快得多。

Prisma的主要用例是构建需要在数据库中持久化数据的服务器端应用程序。

自从Prisma2.0的预览阶段以来,我们已经看到开发人员构建了广泛的应用程序,从社交网络应用程序到电子商务商店,再到生产力工具和市场。我们很高兴看到你和普里斯玛一起建造了什么!

到目前为止,这是我职业生涯中开发得最快的一次。Prisma极大地缩短了实现时间,同时增加了人们对我的代码的信心。我还能够对许多新的增量功能说“是”;现在需要半天时间才能实现一些过去需要两三个人才能完成的事情。

服务器端应用程序通常公开由前端(例如,Web或移动)或其他应用程序使用的API。Prisma客户端兼容所有现有的API技术,如REST、GraphQL、Thrift或GRPC。

PRISMA客户端可用于传统的单片服务器、微服务体系结构和无服务器部署。请阅读有关部署的文档页面以了解更多信息。

尽管Prisma还很年轻,但我们对新兴的生态系统和我们看到的围绕它生长的各种工具感到非常自豪和兴奋。

js生态系统以许多不同的框架而闻名,这些框架试图简化工作流并规定某些约定。许多框架作者决定使用Prisma作为他们选择的数据层,我们对此感到非常谦卑。

由GitHub联合创始人Tom Preston-Werner创建的新Redwood JS框架试图成为Node.js的Ruby on rails版。Redwood JS基于React和GraphQL,并附带了用于无服务器功能的内置部署模型。

另一个在社区中越来越受期待和兴奋的框架是Blitz.js。闪电战构建在Next.js之上,与Redwood相比,它采取了一种与Redwood完全不同的方法。它的目标是完全消除API服务器,恢复服务器渲染框架的简单性。

在Prisma,我们是GraphQL的超级粉丝,并相信它的光明未来。这就是为什么我们成立了Prisma实验室团队,他们致力于在GraphQL生态系统中开发开源工具。

它目前专注于构建Nexus,这是一个用于开发GraphQL服务器的令人愉快的应用程序框架。与Redwood相反,Nexus是一个仅限后端的GraphQL框架,对于如何从前端访问GraphQL API没有任何意见。

使用Nexus的Prisma插件,您可以在GraphQL API中公开Prisma模型,而无需实现将GraphQL解析器连接到数据库时所需的典型CRUD样板。

model{id Int@default(autoincremental())@id电子邮件字符串@唯一名称字符串?Posts Post[]}model{id Int@default(autoincremental())@id标题字符串内容字符串?Author User@Relationship(字段:[Author ID],引用:[ID])Author ID Int}

多亏了这个插件,几乎不需要任何样板就可以为Prisma模型公开完整的CRUD操作,包括过滤器、分页和订购功能。

快速入门(5分钟)了解如何使用Prisma客户端针对演示SQLite数据库发送数据库查询-无需设置!

3月份测试版的积极反响让我们不知所措,我们很高兴能与大家分享今天的正式发布!非常感谢每一个陪伴我们走过这段旅程的人!

如果你是新来普里斯马的,我们很乐意看到你坐在我们的“松弛”车里!如果您已经在使用Prisma,请在#Showcase频道中发布您构建的内容,让每个人都知道。

我们为我们的内容创作者社区感到自豪,他们创造了许多关于Prisma的精彩文章和视频!有关最佳Prisma资源的概述,请查看AWOWE-Prisma repo。别忘了创建一个公关,里面有任何遗漏的东西!

继去年首映成功后,我们很高兴能在6月25日(工作坊)和26日(讲座)举办另一版的棱镜日。

今年,我们将远程访问,并邀请每个人与我们一起围绕现代应用程序开发、数据库工作流的最佳实践以及Prisma的一切内容进行精彩的演讲!