2019 年 4 月 17 日

新数据模型语法:更多模式控制和更简单的迁移

Prisma 的最新版本引入了改进的数据模型语法。它消除了 Prisma 过去对数据库布局所做的许多主观决定,并为开发人员提供了更多控制权。

New Datamodel Syntax: More Schema Control & Simpler Migration

⚠️ 本文已过时,因为它与 Prisma 1 相关,而 Prisma 1 现在已被弃用。要了解有关 Prisma 最新版本的更多信息,请阅读文档。⚠️

在过去的几个月里,我们与社区合作,为 Prisma 定义了一个改进的数据模型 规范。这个新版本称为数据模型 v1.1,在今天的稳定版本中可用。查看此处的文档 here

从今天开始,Prisma 的公共 演示服务器将使用新的数据模型语法。查看文档或此 教程视频,了解如何升级现有项目。


更灵活的数据建模方法

数据模型是每个 Prisma 项目的基础。它作为底层数据库的模式的基础。

当前的数据模型对数据库布局有主观的看法,例如关系、表/列的命名或系统字段。新的数据模型语法消除了许多限制,以便开发人员可以更好地控制他们的模式。

更好地控制您的数据库布局

以下是新的数据模型语法启用的一些功能

  • 指定关系是应使用关系表还是外键
  • 模型/字段名称可以与底层表/列的名称不同
  • 使用任何字段作为 id 字段并“自带 ID”
  • 使用任何字段作为 createdAtupdatedAt 字段

更简单的迁移和改进的自省

在以前的 Prisma 版本中,开发人员必须决定 Prisma 是否应该为他们执行数据库迁移,方法是在 PRISMA_CONFIG 中设置 migrations 标志。

在最新的 Prisma 版本中,migrations 标志已被删除,这意味着开发人员现在始终可以手动迁移数据库,或者使用 Prisma 进行迁移。

我们还对现有数据库的自省进行了大量投资,为使用 Prisma 与遗留数据库或需要在某个时间点执行手动迁移的开发人员实现了流畅的工作流程。


改进的数据模型语法中的新功能是什么?

将模型和字段名称映射到底层表和列

使用旧的数据模型语法,表和列的命名总是与数据模型中的模型和字段完全一致。使用新的 @db 指令,您可以控制底层数据库中应调用哪些表和列

在这种情况下,底层表将被称为 user,列将被称为 full_name

确定如何在数据库模式中表示关系

旧的数据模型对数据库模式中的关系有主观的看法:它们始终表示为关系表。

一方面,这使得可以轻松地将任何现有关系迁移到多对多关系,而无需额外的工作。但是,可能会为这种灵活性付出性能代价,因为关系表的查询通常更昂贵。

虽然 1:1 和 1:n 关系现在可以通过外键表示,但 m:n 关系将继续表示为关系表。

使用新的数据模型,开发人员可以完全控制在底层数据库中表达关系。有两种选择

  • 通过内联引用(即外键)表示关系
  • 通过关系表表示关系

这是一个包含两个关系的示例(一个关系是内联,另一个使用关系表

对于内联关系,@relation(link: INLINE) 指令的放置位置决定了外键存储在关系的哪一端,在本示例中,它存储在 User 表中。

使用任何字段作为 idcreatedAtupdatedAt

使用旧的数据模型,如果开发人员想要自动生成唯一 ID 或跟踪记录的创建/上次更新时间,则需要使用保留字段。

使用新的 @id@createdAt@updatedAt 指令,现在可以将此功能添加到模型的任何字段

更灵活的 ID

当前的数据模型始终使用 CUID 来生成和存储数据库记录的全局唯一 ID。数据模型 v1.1 现在可以维护自定义 ID 以及使用其他 ID 类型(例如整数、序列或 UUID)。


开始使用新的数据模型语法

我们为您准备了两个简短的教程,以探索新的数据模型

有关从现有数据库开始的更全面的教程和说明,请访问文档

先决条件:安装最新的 Prisma CLI

要安装最新版本的 Prisma CLI,请运行

当使用 Docker 运行 Prisma 时,你需要将其 Docker 镜像升级到 1.31

选项 A:从较旧的 Prisma 版本升级

在升级现有的 Prisma 项目时,你可以简单地运行 prisma introspect 来生成具有新语法的 datamodel。以下部分和此视频中通过示例描述了确切的过程

1. 旧的 datamodel 设置

假设你已经有一个正在运行的 Prisma 项目,该项目使用(旧的)datamodel。

当使用旧的 datamodel 时,Prisma 会在底层数据库中创建以下表

  • User
  • Profile
  • Post
  • Category
  • _CategoryToPost
  • _PostToUser
  • _ProfileToUser
  • _RelayId

每个关系都通过一个关系表来表示。_RelayId 表用于通过其 ID 识别任何记录。使用旧的 datamodel 语法,这些是 Prisma 做出的无法规避的决策。

2. 升级你的 Prisma 服务器

在用于部署 Prisma 服务器的 Docker Compose 文件中,请确保为 prismagraphql/prisma 镜像使用最新的 1.31 Prisma 版本。例如

现在升级正在运行的 Prisma 服务器

3. 通过内省生成新的 datamodel

如果你现在运行 prisma deploy,你的 Prisma CLI 将会抛出错误,因为你正在尝试将旧语法中的 datamodel 部署到更新后的 Prisma 服务器。

解决这些错误的最简单方法是通过内省生成使用新语法编写的 datamodel。在你 prisma.yml 所在的目录中运行以下命令

这将内省你的数据库并生成另一个使用新语法的 datamodel,名为 datamodel-TIMESTAMP.prisma (例如 datamodel-1554394432089.prisma)。对于上面的示例,将生成以下 datamodel

4. 部署新的 datamodel

最后一步是删除旧的 datamodel.prisma 文件并将你生成的 datamodel 重命名为 datamodel.prisma(以便 prisma.yml 中的 datamodel 属性指向使用新语法的生成文件)。

完成后,你可以运行

5. 优化你的数据库模式

由于内省没有更改你的数据库布局,所有关系仍然表示为关系表。如果你想了解如何将旧的 1:1 和 1:n 关系迁移到使用外键,请查看此处的文档。

选项 B:从头开始

在了解了如何升级现有 Prisma 项目之后,我们现在将引导你完成一个从头开始的简单设置。

1. 创建一个新的 Prisma 项目

让我们从设置一个新的 Prisma 项目开始

在交互式向导中,选择以下内容

  1. 选择创建新数据库
  2. 选择PostgreSQL(或者如果你喜欢,选择 MySQL)
  3. 选择你首选语言的客户端(可选,因为我们不会使用客户端

在通过 Docker 启动 Prisma 服务器和数据库之前,请为你的数据库启用端口映射。这将使你以后可以使用本地数据库客户端(例如 PosticoTablePlus)连接到数据库。

在生成的 docker-compose.yml 中,取消注释数据库的 Docker 镜像配置中的以下行

2. 定义 datamodel

让我们定义一个利用新的 Prisma 功能的 datamodel。打开 datamodel.prisma 并将内容替换为以下内容

以下是关于此 datamodel 定义的一些重要信息

  • 每个模型都映射到一个以模型命名但使用 @db 指令小写的表。
  • 有以下关系
    • 1:1UserProfile 之间
    • 1:nUserPost 之间
    • n:mPostCategory 之间
  • UserProfile 之间的 1:1 关系在 User 模型上使用 @relation(link: INLINE) 进行注释。这意味着如果关系存在,则数据库中的 user 记录将引用 profile 记录(因为 profile 字段不是必需的,所以关系可能只是 NULL)。INLINE 的替代方案是 TABLE,在这种情况下,Prisma 将通过专用的关系表跟踪关系。
  • UserPost 之间的 1:n 关系通过 post 表的 author 列内联跟踪,即 @relation(link: INLINE) 指令在 Post 模型的 author 字段上推断。
  • PostCategory 之间的 n:m 关系通过名为 PostToCategory 的专用关系表进行跟踪。此关系表是 datamodel 的一部分,并使用 @relationTable 指令进行注释。
  • 每个模型都有一个使用 @id 指令注释的 id 字段。
  • 对于 User 模型,数据库通过使用 @createdAt 指令注释的字段自动跟踪记录的创建时间
  • 对于 Post 模型,数据库通过使用 @createdAt@updatedAt 指令注释的字段自动跟踪记录的创建和更新时间

3. 部署 datamodel

在下一步中,Prisma 将此 datamodel 映射到底层数据库

Category

表格

索引

index_nameindex_algorithmis_uniquecolumn_name
category_pkeyBTREETRUEid
Post

表格

索引

index_nameindex_algorithmis_uniquecolumn_name
post_pkeyBTREETRUEid
PostToCategory

表格

索引

index_nameindex_algorithmis_uniquecolumn_name
post_to_category_AB_uniqueBTREETRUEcategory,post
post_to_category_BBTREEFALSEpost
Profile

表格

索引

index_nameindex_algorithmis_uniquecolumn_name
profile_pkeyBTREETRUEid
User

表格

索引

index_nameindex_algorithmis_uniquecolumn_name
user_pkeyBTREETRUEid
hello-datamodel$dev.user.email._UNIQUEBTREETRUEemail

4. 在 Prisma Admin 中查看和编辑数据

从这里开始,如果你想以编程方式访问数据库中的数据,可以使用 Prisma 客户端。在下面,我们将重点介绍如何使用 Prisma Admin 与数据进行交互。

访问文档,了解如何使用 TablePlus 连接到数据库并探索底层数据库架构。

要访问 Prisma Admin 中的数据,你需要导航到 Prisma 项目的 Admin 端点:https://127.0.0.1:4466/_admin

Access your data in Prisma Admin


分享你的反馈和想法

虽然新的 datamodel 语法已经包含了我们社区要求的许多功能,但我们仍然看到了进一步改进的机会。例如,datamodel 尚未提供多列索引多态关系

我们目前正在开发一种新的数据建模语言,它将是当前使用的 SDL 的变体。

我们很想听听你对新 datamodel 的看法。请通过在反馈存储库中打开一个问题或加入Spectrum上的讨论来分享你的反馈。

不要错过下一篇文章!

注册 Prisma 新闻邮件