2019 年 6 月 18 日

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

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

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

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

TLDR(太长不看)

今天,我们发布 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 在设计时考虑了开发人员。

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

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

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

迁移数据库模式可能是一项非常耗时且令人沮丧的体验。 Lift 为开发人员提供了一个简单的迁移模型,该模型功能强大,即使对于最复杂的用例也足够用。

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

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

迁移文件夹(以及数据库中的迁移历史记录表)使开发人员可以进一步轻松地回滚迁移。

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-generator)在模式文件中。新项目定义的简单示例如下

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

文档中了解有关改进的数据建模语法的更多信息。

Prisma 1 用户注意:新的数据模型语法很大程度上受到 SDL 的启发。它已针对描述数据库模式进行了优化,但在大多数用例中,使用它会感觉非常类似于定义 Prisma 1 数据模型。在 规范中了解更多信息。

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

与 Prisma 客户端 API 相比,Photon 提供了强大的数据访问 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 存储库中打开一个 issue。


Prisma Day 与您相见

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

我们特别期待在 Prisma Day 欢迎 Prisma 社区,参加为期一天的鼓舞人心的演讲和精彩的对话。明天见! 🙌

不要错过下一篇文章!

注册 Prisma 新闻通讯