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 “应用” 更改。

每次迁移都通过一系列明确的步骤来表示,因此你可以在整个项目的生命周期中保留迁移历史记录,并且可以轻松地在迁移之间来回切换。迁移还可以使用前/后钩子进行扩展。

更好地协同工作:Photon 和 Lift 工作流程的无缝集成

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

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

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

数据模型是您的 Photon 和 Lift 工作流的核心。它充当数据库 schema 和用于与数据库交互的编程 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 迁移数据库遵循一个两步流程

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

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

4. 使用 Photon 访问数据库

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

您可以使用 package.json 中的 seed 脚本来 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 为简单和复杂用例提供安全且有弹性的迁移

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

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

如果此工作流不符合您的需求,您可以使用“before/after”钩子对其进行扩展,以便在执行迁移之前或之后运行自定义代码。

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

Lift 还被设计为可以在 CI/CD 环境中无缝工作。将来,Lift 将启用不可变的 schema 部署(受 ZEIT 的不可变部署的启发)。

Prisma 2 中的新功能

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

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

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

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

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

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

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

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

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

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

Photon 提供强大的数据访问 API,与 Prisma 客户端 API 相比,有一些细微的变化和改进。在此处找到完整的 API 文档此处

统一对 CRUD 操作的访问

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

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

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

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

请注意,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 新闻简报