Prisma
对接数据库是WEB应用程序开发中最具挑战性的领域之一。数据建模,模式迁移和编写sql是应用程序开发人员每天处理的常见任务。为了提高开发人员的效率和开发体验,手写SQL、SQL构造器,以及ORM等各种各样的数据库工具先后应运而生。然而,一款号称下一代ORM的数据库工具自2019年首次发布以来,隐隐有后来居上之势,仅用不到一年的时间,就冲上了2020年InfoWorld年度最佳开源软件排行榜第二位。在颁奖评语中,InfoWorld盛赞它为最适合开发人员的ORM框架。近来许多开发者也纷纷表示,这款兼顾生产力和控制力的工具已然成为他们开发生涯中升级打怪的必备法宝。这颗冉冉升起的新星就是Prisma,一款用于 Node.js 和 TypeScript 的下一代 ORM。
应用程序的构建离不开数据库的构建、管理和使用,一代代开发者与数据库斗智斗勇的同时,也在不断开发和寻找更加强大的数据库工具。然而,从SQL到ORM,现有的数据库工具总是存在着各种各样的问题,无法同时兼顾控制力(灵活度)和生产力。结构化查询语言SQL问世于1974年,至今依然长盛不衰。手动编写SQL可以完全控制数据库操作,但SQL的学习成本较高,不易上手;而且,手动编写SQL时,常常会遇到手动处理链接、操作模板等琐碎的工作,一旦出错,还要花大量的时间调试,令开发过程举步维艰;另外,如果数据库发生了改动,那么类型文件也需要同步修改,从而浪费大量时间。因此,手动编写SQL不易达到高水平的生产力。于是,70年代末,出现了SQL构造器,这种工具为构建 SQL 语句提供了封装层次较高的 API,可以更容易地构建复杂的SQL语句,减少工作量,一定程度上提高了生产力。但最大的问题在于,使用SQL构造器需要开发者从 SQL 的角度来对待数据,但应用数据往往是关系型的对象,这就会导致了数据在认知层面与实际层面的差异。开发者不得不经常切换思维模型才能写好 SQL 语句。另外一个问题是,如果开发者对 SQL 的掌握不够扎实,往往会用错SQL,需要大量的时间来纠正错误,无异于搬起石头砸自己的脚,出力不讨好。
难到跑路的SQL
于是,为了提高对数据库工具的控制力,80年代初,开发者们开了一把历史的倒车,推出了结合结构化查询语言(SQL)和四代语言(4GL)的编程语言SQL/4GL,用来构建更加复杂的数据库应用程序。然而,SQL/4GL存在着和SQL相似的问题:它的编程语言比较复杂,学习成本较高,不容易上手;编程环境较为繁琐,需要安装多个软件才能完成编程任务;编程效率较低,容易出现编程错误,调试起来也很麻烦。因此,SQL/4GL同样在生产力方面存在较大缺陷。
以上几个围绕SQL的解决方案都未能很好地提高生产力,很大程度上是因为SQL本身的学习门槛较高,学习曲线陡峭,新手难以入门,老手容易踩坑。这就意味着,解决生产力受限的问题,首先要解决了SQL。那么,在软件开发的过程中,有没有绕过SQL这座难关的捷径呢?答案是肯定的。
随着面向对象的软件开发方法发展,上世纪90年代,ORM技术横空出世。ORM是一种程序技术,它可以将关系数据库中的数据映射到对象中,从而使得开发人员可以使用面向对象的方式来操作数据库。换言之,ORM技术可以让开发者将所有数据定义为 class,一个 class 就是一个数据表,开发者不需要对 SQL 有那么深的理解,从而大大减少数据库操作的复杂性,提高开发效率,使得开发人员可以更加专注于业务逻辑的开发,在生产力方面实现了质的飞跃。然而,效率提高的代价是控制力的降低:开发者将数据理解为对象的集合,但实际上这些数据是一个一个的表。这种认知上的差异会带来相当的复杂性,并引发性能陷阱。一位开发者抱怨道:“ORM 像一个泥沼,一开始还是平地,但是随着时间的推移,它越来越复杂,不久就将用户陷于迷茫之中。”
ORM概述
大概有…这么迷茫?
SQL难以提高生产力,ORM难以把握控制力,难道真的不存在两全其美的解决方案吗?自SQL和ORM先后问世以来,陆续出现过数十款基于SQL和ORM的数据库工具,但都未能实现实质上的突破。一直到2019年,号称下一代ORM的Prisma终于拨云见日地向整个数据库工具领域展示了兼顾控制力和生产力的可能。
Prisma称自己为一款数据库工具箱,它提供的工具主要包括Prisma Schema、Prisma Client、Prisma Migrate、Prisma CLI、Prisma Studio 等。其中最为核心的是 Prisma Schema 和 Prisma Client。与一般 ORM 完全由 Class 描述数据模型不同,Primsa 采用了全新语法 Primsa Schema 描述数据模型,用户执行 prisma generate 产生一个配置文件并存储在指定位置后,就可以使用 Prisma Client 对数据增删改查。
Prisma的主要工具
相较于传统的ORM,Prisma在性能和生产力方面的提升主要来源于以下几点突破:
1.Prisma Migrate 可以将 Prisma schema转换为所需的 SQL,以创建和更改数据库中的表。同时,开发者可以轻松地根据自己的特定需求对其进行自定义。通过这种方法,Prisma Migrate 在生产力和控制力之间取得了很好的平衡。
-
Prisma 为开发者提供了一个“健康的约束”,能够有效地防止开发者误用SQL,并让开发者更容易做出正确的操作,从而节约了纠错的时间成本。
-
Prisma 的VS Code 扩展提供语法高亮显示,自动补全,快速修复和许多其他功能,有效提高了数据建模的效率。
-
Prisma Client使开发人员可以在对象中进行思考,因此可以以一种熟悉且自然的方式来推理其数据。
-
Prisma提供类型安全的数据库查询,可以在编译时进行验证。
-
可以在代码编辑器中自动完成,而不需要查找文档。
以上的突破,让Prisma的生产力提高到了空前的水平,同时在控制力方面仅次于手写SQL。由此,初出茅庐的Prisma便斩获了GitHub Octoverse和红帽开放创新实验室颁发的2019年最佳开源项目奖,次年更是登上InfoWorld年度最佳开源软件排行榜第二位,被誉为“最适合开发人员的ORM框架”。
从技术角度帮助用户省时提效的同时,Prisma在运营上也花费了不少心血。作为开源项目,Prisma 安排了专门的产品和工程团队监控 GitHub 的问题,提出问题的用户通常在24小时内即可收到回应;Prisma每两周发布一次新版本,每次发布后,团队都会在 Youtube 上直播新功能,并从社区获得反馈;Prisma还建立了专门的社区支持团队,在开发人员提出关于 Prisma 的任何问题时,无论是在 Slack,GitHub 讨论区还是 Stackoverflow 上,都可以即时为他们提供帮助。有道是真诚是永远的必杀技,Prisma对开发者无微不至的关怀,为它赢得了大量的忠实用户。如今,Prisma在GitHub获得的star数已达25k+,拥有超过25万名活跃用户。在中国,Prisma也吸引了一批忠实的开发者,成立了以技术交流为核心的Prisma中国社区。
Prisma发展历程时间轴
不过,虽然Prisma的优势十分明显,但它并没能完全取代传统ORM和SQL;一些开发者也表示,在实现一些特定的需求时,自己更愿意选择传统的ORM或SQL。或许这就是开发这片沃土所蕴含的勃勃生机的源泉:这里不苛求面面俱到的完美,即便只有一招鲜,也能拥有自己的一片天。从SQL到Prisma,没有哪一款工具是满足一切用户需求、全面碾压其他竞品的“银弹”,但只要能满足一定数量用户的特定需求,新产品、新工具从来不缺少生存发展的空间。
而对于Prisma的开发团队而言,发展的长期愿景远远不止构建ORM:在一篇博客文章中,Prisma团队表示,Prisma 的愿景是使 Facebook、Twitter 和 Airbnb 等公司使用的定制数据访问层民主化,并使其适用于所有规模的开发团队和组织。Prisma团队认为,此举将大大提升开发人员的工作效率和开发体验。常言道,“达则兼济天下”,Prisma 的愿景,正是“开放、共享、协同”的开源精神的生动诠释。
后端低代码开发工具飞布基于Prisma设计了数据建模功能,让用户无需切换工具,即可完成数据建模和数据预览,并利用Prisma的迁移能力,实现了跨数据库类型迁移表结构,不依赖于node.js环境,从而实现了开发流程的闭环。
飞布的数据建模界面支持两种模式:普通视图和源码视图,分别适用于新手开发者和熟悉Prisma的开发者。普通视图本质上是对Prisma Schema的可视化封装。飞布底层封装了prisma引擎,利用prisma的内省能力,将数据库中的表结构内省成GraphQL Schema,并利用prisma的查询能力解析GraphQL Opeartion读取/更新数据库数据。
源码视图集成了在线prisma model编辑器,展示Prisma schema源文件,同时支持语法提醒和高亮展示,熟悉Prisma的开发者可以用它实现任意形式的数据建模。
欢迎体验飞布:www.fireboom.io/