2019年6月18日

Prisma 2 预览版:类型安全数据库访问 & 声明式迁移

我们很高兴今天发布 Prisma 2 预览版。它具有一个类型安全的数据库客户端 (Photon) 以及一个声明式迁移系统 (Lift)。请通过试用并分享您的反馈来帮助我们改进 Prisma 2!

这是 Prisma 2 的早期预览版。当前的限制包括缺少功能、性能有限和稳定性问题。我们将在今年晚些时候发布稳定版之前解决所有这些限制。

Prisma 2 Preview: Type-safe Database Access & Declarative Migrations

太长不看

今天我们发布了 Prisma 2 的首个预览版。它包含两个主要工具,用于简化和现代化数据库工作流程

  • Photon: 一个类型安全、自动生成的数据库客户端 (可理解为:ORM)
  • Lift: 声明式数据建模和数据库迁移

Photon 和 Lift 可以在您的应用程序中单独使用,也可以一同使用。Prisma 2 将在预览阶段运行几个月。请尝试并分享您的反馈!


目录

2019年的数据库工作流程已经过时

近年来,应用程序开发的许多领域已得到现代化,以适应数字化时代带来的新要求

  • 前端 Web 应用程序通常由 DOM 的声明式抽象(React、Vue 等)提供支持,而不是使用静态 HTML 和 jQuery。
  • 后端开发人员受益于 Node.js、Go 或 Elixir 等现代语言和运行时,以便为其用例做出正确的权衡。
  • 计算过去通常在私有数据中心进行配置。如今,大多数工作负载都可以在公共云中的容器或无服务器环境中运行。
  • 存储解决方案正从自托管转向 RDS 或 Azure Storage 等托管服务。

但开发人员每天处理的数据库工作流程呢?从应用程序内部访问数据库或执行模式迁移的下一代工具是什么?

Confusion with data management

对于数据库访问,开发人员可以使用传统的 ORM(例如 Node.js 的 Sequelize 或 Go 的 GORM)。尽管它们通常有助于项目启动,但随着项目复杂性迅速超出传统 ORM 的能力,它们并非长期的理想选择。

模式迁移的工具和最佳实践更加零散,组织倾向于开发自己的工具和流程来迁移数据库模式。

Prisma 2:下一代数据库工具

在过去三年中,我们帮助大型公司和个人开发人员解决了他们的数据访问挑战,我们很荣幸发布一套工具,帮助开发人员在现代开发技术栈中与数据库协作。

Prisma 2 包含两个独立的工具,用于解决数据访问和迁移问题

  • Photon: 一个类型安全的数据库客户端,用于更高效、安全的数据库访问
  • Lift: 一个现代、声明式的迁移系统,支持自定义工作流程

让我们更详细地了解 Photon 和 Lift。

Photon – 替代传统 ORM 的类型安全数据库客户端

Photon.js diagram

Photon 是一个类型安全的数据库客户端,它根据 Prisma 数据模型(数据库模式的表示形式)自动生成。它提供了一个强大且轻量级的映射代码层,您可以使用它在应用程序中与数据库交互。

它拥有一个现代且符合人体工程学的数据访问 API,专为应用程序开发人员的需求量身定制。您可以在 Photon 网站上探索 Photon API。

Lift – 声明式数据建模 & 迁移

Lift demo

Lift 基于 Prisma 的声明式数据模型定义,该定义将您的数据库模式进行编码。要迁移您的数据库,您需要调整数据模型,并使用 Lift CLI “应用”更改。

每次迁移都通过一系列明确的步骤表示,这样您就可以在整个项目生命周期中保留迁移历史,并轻松地在不同迁移之间来回切换。迁移还可以通过 before/after 钩子进行扩展。

更佳组合:Photon 和 Lift 工作流程的无缝集成

Photon 和 Lift 都可以在您的应用程序中单独使用,无论是新项目还是现有项目。然而,它们都通过Prisma CLI 无缝集成,并能很好地协同工作。

这两种工具的共同基础是数据模型定义,它具有两个职责:

  • 对于Photon,它为生成的数据库客户端(CRUD API)提供模型
  • 对于Lift,它描述了底层数据库的模式。

数据模型是 Photon 和 Lift 工作流程的核心。它充当您的数据库模式和您用于与数据库交互的编程 API 之间的中间抽象层


Prisma 2 入门

更新(2020年1月): 本博客文章的此部分已过时。Prisma 2 的设置说明自博客文章首次发布以来已更改。您可以在 GitHub 上的 Prisma 2 官方文档中开始使用

1. 安装 Prisma 2 CLI

您可以使用 npm 或 Yarn 安装Prisma 2 CLI

2. 运行交互式 prisma2 init 流程 & 选择样板

运行以下命令开始:

在交互式提示中选择以下内容:

  1. 选择SQLite
  2. 选中两个选项,PhotonLift
  3. 选择TypeScript
  4. 选择从头开始

一旦执行完毕,init 命令就会为您创建一个初始项目设置。

进入hello-prisma2 目录并安装 Node 依赖。

3. 使用 Lift 迁移您的数据库

使用 Lift 迁移数据库遵循 2 步流程:

  1. 保存新的迁移(迁移在文件系统中表示为目录)
  2. 运行迁移(实际迁移底层数据库的模式)

在 CLI 命令中,这些步骤可以按如下方式执行 (CLI 步骤正在更新以匹配)

4. 使用 Photon 访问您的数据库

src/script.ts 中的脚本包含一些示例 API 调用,例如:

您可以使用 package.json 中的 seed 脚本来填充数据库

您可以使用以下命令执行脚本:

5. 构建应用程序

连接 Photon 到您的数据库后,您现在可以开始构建应用程序了。在 photonjs 仓库中,您可以找到以下用例的参考示例(适用于 JavaScript 和 TypeScript):


为什么 Prisma 不同于现有数据库工具/ORM

开发人员通常混合使用现有和自定义/手写的数据库工具来处理日常数据库工作流程。Prisma 将主要的数据库工作流程统一到一个连贯的生态系统中,从而提高开发人员的生产力。

Prisma 使用声明式数据模型

使用 Prisma,您可以使用声明式且易于理解的数据建模语法定义模型。定义的模型会映射到底层数据库,同时为 Photon 生成的数据访问 API 提供基础。

这种方法的另一个主要优点是,数据模型定义可以提交到版本控制中,这样整个团队都能始终了解应用程序所基于的模型。

Photon 是一个类型安全、自动生成的数据库客户端

传统的 ORM 通常无法满足大型应用程序的复杂需求,但仍然需要数据映射层。典型的解决方案是为应用程序模型手动编写自定义数据访问层。

Photon 是自动生成的代码,它取代了您无论如何都需要为应用程序编写的手动数据访问层。自动生成可确保 API 的一致性,减少人为错误,并节省大量本用于编写 CRUD 样板代码的时间。

Photon 提供完全类型安全的 API(甚至适用于 JavaScript)。此 API 可用作构建更高级 ORM 模式(仓库、活动记录、实体等)的基础。

注重开发者体验 & 人体工程学

虽然大多数传统 ORM 试图简单地将 SQL 抽象为一种编程语言,但 Photon 的数据访问 API 是以开发人员为中心设计的。

特别是当处理关系时,Photon 的 API 比传统 ORM 更具开发者友好性。JOIN 和原子事务被优雅地抽象为嵌套的 API 调用。以下是一些示例:

文档中了解更多关于 Photon 关系 API 的信息。

使用 Lift 为简单和复杂用例提供安全且弹性的迁移

迁移数据库模式可能是一个极其耗时且令人沮丧的经历。Lift 为开发人员提供了一个简单的迁移模型,它强大到足以应对最复杂的用例。

在绝大多数情况下,开发人员只需调整其声明式数据模型定义以表示所需的数据库结构,然后保存运行迁移。

每当此工作流程不符合您的需求时,您可以使用“before/after”钩子来扩展它,以便在执行迁移之前或之后运行自定义代码。

迁移文件夹(以及数据库中的迁移历史表)让开发人员能够进一步轻松回滚迁移。

Lift 还旨在与 CI/CD 环境无缝协作。将来,Lift 将实现不可变模式部署(灵感来自 ZEIT 的不可变部署)。

Prisma 2 有哪些新功能?

Prisma 2 不仅将 Prisma 的主要工作流程拆分为独立的工具,还对每个工具本身进行了根本性改进,并为未来的开发提供了强大的核心。

改进的数据模型语法 & 项目定义

在 Prisma 1 中,每个 Prisma 项目都需要两个文件:

  • prisma.yml:项目的根配置文件
  • datamodel.prisma:抽象数据库并为生成的 Prisma 客户端 API 提供基础

在 Prisma 2 中,配置选项和数据模型已合并到一个单独的Prisma 模式文件中,通常称为 schema.prisma

开发人员在模式文件中定义数据模型,并指定如何连接到各种数据源以及目标代码生成器(例如 photonjs 生成器)。一个新的项目定义的简单示例如下:

Prisma 2 还附带一个VS Code 扩展,为数据建模语法提供自动格式化语法高亮(更多功能如自动完成、跳转定义和 linting 即将推出)!

文档中了解更多关于改进的数据模型语法的详情。

致 Prisma 1 用户: 新的数据模型语法深受 SDL 启发。它已针对描述数据库模式进行了优化,但在大多数用例中,使用它会感觉与定义 Prisma 1 数据模型非常相似。在规范中了解更多。

Photon 中改进的数据访问 API & 类型安全字段选择

Photon 提供了一个功能强大的数据访问 API,与 Prisma 客户端 API 相比,它进行了一些细微的更改和改进。在此处查找完整的 API 文档。

统一访问 CRUD 操作

CRUD 操作在模型之间是统一的,并且可以通过 Photon 实例上的属性进行访问,例如,对于模型 User,您可以按如下方式访问读写数据的操作:

请注意,users 属性的名称是使用 pluralize 包生成的。您可以在文档中找到 Photon.js 的 API 参考。

通过 selectinclude 进行类型安全字段选择

Photon 数据访问 API 中的一个全新功能是能够以类型安全的方式精确指定 API 操作应返回的字段。这可以通过可传递给任何 CRUD API 调用的两个选项之一来完成:

  • select:仅返回明确指定的字段(排他选择
  • include:包含额外字段,例如关系或惰性属性(额外包含

请注意,include 尚未成为 Photon.js API 的一部分,但很快就会实现!

假设您的 Photon API 是根据以上数据模型生成的,以下是使用 selectinclude 的示例:

此代码片段仅突出显示 findOneselectinclude,但您可以将这些选项提供给任何其他 CRUD 操作:findManycreateupdatedelete

您可以在文档中了解更多关于 Photon.js 字段选择 API 的信息。

使 Prisma 服务器成为可选

Prisma 1 中作为数据库代理所需的 Prisma 服务器现在是可选的。

这是由于一个根本性的架构变化:以前在 Prisma 服务器内部运行的查询和迁移引擎现在可以作为普通二进制文件与您的应用程序在同一主机上运行。

Prisma client

Prisma 核心已用 Rust 重写

Prisma 1 是用 Scala 实现的,这意味着它需要在 JVM 中运行。为了减少运行 Prisma 的开销,我们决定用 Rust 重写它。

Rust 的优点包括显著降低内存占用、更好的性能,并且不再需要部署、监控和维护额外的服务器来运行 Prisma 2。

Rust 已被证明是 Prisma 的完美语言,使我们能够编写安全且性能极高的代码。

稳定 Prisma 2 & 避免未来的重大变更

尽管 Prisma 2 引入了许多重大变更,但我们坚信这些变更也带来了根本性改进,对于实现我们为简单和复杂应用程序构建现代化数据层的愿景是必要的。

我们在预览期投入了大量精力,以确保未来建立在稳定的基础之上。在预览期间,可能仍然会有重大变更。在 GA 版本发布后,我们承诺提供稳定、非破坏性的 API。

请通过报告您遇到的任何问题并提出文档中未解决的问题来帮助我们。

我们正在计划发布一系列博客文章,深入探讨 Prisma 2 的特定部分。这包括 Rust 重写、Lift 的内部工作原理等主题,以及阐述我们许多技术决策动因和核心设计原则的文章。


想要某个功能?分享您的反馈!

我们对 Prisma 2 的现状感到非常兴奋,但我们不想止步于此。我们知道我们做出的一些决定可能会有争议,所以如果您有强烈意见,请加入讨论,分享您的想法、建议和反馈!

如果您想产生影响并帮助塑造 Prisma 2 最终的模样,现在正是加入的最佳时机!请在 Slack 上的#prisma2-preview 频道中留下您的反馈,或在 liftphotonjs 仓库中提出问题。


Prisma Day 见

Prisma 2 预览版并不是本周唯一令人兴奋的事情。我们对即将到来的三天会议感到非常兴奋:

我们尤其期待在 Prisma Day 欢迎 Prisma 社区,共同度过充满启发性演讲和精彩对话的一天。明天见!🙌

不要错过下一篇文章!

订阅 Prisma 新闻通讯

© . All rights reserved.