2019年4月17日

新数据模型语法:更强的Schema控制与更简单的迁移

Prisma最新版本引入了改进的数据模型语法。它摒弃了Prisma过去在数据库布局方面许多主观性决策,为开发者提供了更多控制权。

New Datamodel Syntax: More Schema Control & Simpler Migration

⚠️ 本文已过时,因为它与Prisma 1相关,后者现已弃用。要了解Prisma的最新版本,请阅读文档。 ⚠️

在过去的几个月里,我们与社区合作,为Prisma定义了改进的数据模型规范。这个新版本名为数据模型 v1.1,已在今天的稳定版中发布。请查阅这里的文档。

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


一种更灵活的数据建模方法

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

当前的数据模型在数据库布局方面存在主观性,例如关系、表/列的命名或系统字段。新的数据模型语法消除了许多限制,使开发者能更好地控制其模式。

对数据库布局有更多控制权

新数据模型语法支持以下几项功能:

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

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

在之前的Prisma版本中,开发者必须通过设置PRISMA_CONFIG中的migrations标志来决定Prisma是否为他们执行数据库迁移。

最新版本的Prisma已移除migrations标志,这意味着开发者现在可以随时手动迁移数据库使用Prisma进行迁移。

我们还在现有数据库的内省方面投入了大量精力,为使用Prisma处理旧数据库或需要在某个时间点执行手动迁移的开发者提供了流畅的工作流程。


改进后的数据模型语法有哪些新功能?

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

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

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

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

旧的数据模型对数据库模式中的关系有主观性:它们总是被表示为关系表。

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

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

通过新的数据模型,开发者可以完全控制在底层数据库中表达关系的方式。有两种选择:

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

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

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

使用任何字段作为idcreatedAtupdatedAt

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

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

更灵活的ID

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


新数据模型语法入门

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

有关更详细的教程和使用现有数据库的入门说明,请访问文档

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

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

通过Docker运行Prisma时,您需要将其Docker镜像升级到1.31

选项 A:从旧版Prisma升级

升级现有Prisma项目时,只需运行prisma introspect即可生成使用新语法的数据模型。具体过程在以下章节和此视频中通过示例进行了描述

1. 旧数据模型设置

假设您已经有一个使用(旧)数据模型的正在运行的Prisma项目。

使用旧数据模型时,Prisma会在底层数据库中创建以下表

  • 用户
  • 个人资料
  • 帖子
  • 类别
  • _CategoryToPost
  • _PostToUser
  • _ProfileToUser
  • _RelayId

每个关系都通过一个关系表表示。_RelayId表用于通过其ID标识任何记录。使用旧的数据模型语法,这些是Prisma做出的决策,无法绕过。

2. 升级您的Prisma服务器

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

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

3. 通过内省生成新的数据模型

如果您现在运行prisma deploy,您的Prisma CLI将抛出错误,因为您正尝试将旧语法的数据模型部署到已更新的Prisma服务器上。

解决这些错误的最简单方法是通过内省生成一个使用新语法编写的数据模型。在您的prisma.yml文件所在的目录中运行以下命令

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

4. 部署新的数据模型

最后一步是删除旧的datamodel.prisma文件,并将您生成的数据模型重命名为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. 定义数据模型

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

以下是此数据模型定义的一些重要部分

  • 每个模型都使用@db指令映射到一个表,该表的名称与模型名称相同但为小写。
  • 存在以下关系
    • 1:1 UserProfile之间
    • 1:n UserPost之间
    • n:m PostCategory之间
  • 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的专用关系表进行跟踪。该关系表是数据模型的一部分,并使用@relationTable指令进行注解。
  • 每个模型都有一个使用@id指令注解的id字段。
  • 对于User模型,数据库通过使用@createdAt指令注解的字段自动跟踪记录的创建时间
  • 对于Post模型,数据库通过使用@createdAt@updatedAt指令注解的字段自动跟踪记录的创建时间和更新时间

3. 部署数据模型

下一步,Prisma会将此数据模型映射到底层数据库

Category

索引

索引名称索引算法是否唯一列名称category_pkeyBTREETRUEid
Post

索引

索引名称索引算法是否唯一列名称post_pkeyBTREETRUEid
PostToCategory

索引

索引名称索引算法是否唯一列名称post_to_category_AB_uniqueBTREETRUEcategory,postpost_to_category_BBTREEFALSEpost
Profile

索引

索引名称索引算法是否唯一列名称profile_pkeyBTREETRUEid
User

索引

索引名称索引算法是否唯一列名称user_pkeyBTREETRUEidhello-datamodel$dev.user.email._UNIQUEBTREETRUEemail

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

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

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

要访问Prisma Admin中的数据,您需要导航到Prisma项目的Admin端点:http://localhost:4466/_admin

Access your data in Prisma Admin


分享您的反馈和想法

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

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

我们很想听听您对新数据模型的看法。请通过在反馈仓库中提交问题分享您的反馈,或加入Spectrum上的讨论。

不要错过下一篇文章!

订阅Prisma新闻通讯

© . All rights reserved.