Prisma的最新版本改进了数据模型语法。它摒弃了Prisma过去对数据库布局的许多主观决策,使开发人员能够获得更多的控制权。

在过去的几个月里,我们与社区合作,为Prisma定义了一个改进的数据模型规范。这个新版本被称为数据模型v1.1,并已在今天的稳定版本中提供。请在此处查看文档这里。
更灵活的数据建模方法
数据模型是每个Prisma项目的基础。它作为底层数据库模式的基础。
当前的数据模型对数据库布局有主观意见,例如关系、表/列的命名或系统字段。新的数据模型语法解除了许多限制,使开发人员可以更好地控制其模式。
更多地控制数据库布局
以下是新数据模型语法启用的一些功能:
- 指定关系应使用关系表还是外键
- 模型/字段名称可以与底层表/列的名称不同
- 使用任何字段作为
id字段并“自带ID” - 使用任何字段作为
createdAt或updatedAt字段
更简单的迁移和改进的内省
在以前的Prisma版本中,开发人员必须通过在PRISMA_CONFIG中设置migrations标志来决定Prisma是否应为他们执行数据库迁移。
migrations标志已在最新的Prisma版本中移除,这意味着开发人员现在可以随时手动迁移数据库或使用Prisma进行迁移。
我们还在现有数据库的内省方面投入了大量精力,为使用Prisma处理传统数据库或需要随时执行手动迁移的开发人员提供了流畅的工作流程。
改进的数据模型语法有哪些新功能?
将模型和字段名称映射到底层表和列
使用旧的数据模型语法,表和列的命名始终与数据模型中的模型和字段完全相同。使用新的@db指令,您可以控制底层数据库中表和列的名称
在这种情况下,底层表将被称为user,列将被称为full_name。
决定如何在数据库模式中表示关系
旧的数据模型对数据库模式中的关系有主观意见:它们总是表示为关系表。
一方面,这使得无需额外工作即可轻松地将任何现有关系迁移到多对多关系。但是,这种灵活性可能需要付出性能代价,因为关系表的查询成本通常更高。
虽然1:1和1:n关系现在可以通过外键表示,但m:n关系将继续表示为关系表。
通过新的数据模型,开发人员可以完全控制如何在底层数据库中表达关系。有两种选择
- 通过内联引用(即外键)表示关系
- 通过关系表表示关系
这是一个包含两个关系的示例(一个为内联,另一个使用关系表)
对于内联关系,@relation(link: INLINE)指令的位置决定了外键存储在关系的哪一端,在本例中,它存储在User表中。
使用任何字段作为id、createdAt或updatedAt
使用旧的数据模型,如果开发人员想要自动生成唯一ID或跟踪记录的创建/上次更新时间,则需要使用保留字段。
使用新的@id、@createdAt和@updatedAt指令,现在可以将此功能添加到模型的任何字段
更灵活的ID
当前数据模型总是使用CUIDs来生成和存储数据库记录的全局唯一ID。数据模型v1.1现在可以维护自定义ID以及使用其他ID类型(例如整数、序列或UUID)。
开始使用新的数据模型语法
我们为您准备了两个简短的教程来探索新的数据模型
- 选项A:将旧的Prisma项目升级到新的数据模型语法
- 选项B:从头开始使用新的数据模型语法
有关更全面的教程和使用现有数据库入门的说明,请访问文档。
先决条件:安装最新的Prisma CLI
要安装最新版本的Prisma CLI,请运行
当使用Docker运行Prisma时,您需要将其Docker镜像升级到
1.31。
选项A:从旧的Prisma版本升级
升级现有Prisma项目时,您可以简单地运行prisma introspect以新语法生成数据模型。具体过程在以下章节和此视频中通过示例进行描述
1. 旧数据模型设置
假设您已经有一个使用(旧)数据模型运行的Prisma项目。
使用旧数据模型时,Prisma会在底层数据库中创建以下表
UserProfilePostCategory_CategoryToPost_PostToUser_ProfileToUser_RelayId
每个关系都通过关系表表示。_RelayId表用于通过其ID标识任何记录。使用旧数据模型语法,这些是Prisma做出的无法规避的决策。
2. 升级您的Prisma服务器
在用于部署Prisma服务器的Docker Compose文件中,确保为prismagraphql/prisma镜像使用最新的1.31Prisma版本。例如
现在升级正在运行的Prisma服务器
3. 通过内省生成新数据模型
如果您现在运行prisma deploy,您的Prisma CLI将抛出错误,因为您尝试将旧语法的数据模型部署到已更新的Prisma服务器。
解决这些错误的最简单方法是通过内省生成用新语法编写的数据模型。在您的prisma.yml所在的目录中运行以下命令
这会内省您的数据库并生成另一个使用新语法的数据模型,称为datamodel-TIMESTAMP.prisma(例如datamodel-1554394432089.prisma)。对于上面的示例,生成以下数据模型
4. 部署新数据模型
最后一步是删除旧的datamodel.prisma文件,并将生成的datamodel重命名为datamodel.prisma(以便prisma.yml中的datamodel属性指向使用新语法的生成文件)。
完成此操作后,您可以运行
5. 优化数据库模式
由于内省没有改变数据库布局的任何内容,所有关系仍然以关系表的形式表示。如果您想了解如何将旧的1:1和1:n关系迁移到使用外键,请查看此处的文档。
选项 B:从头开始
在学习了如何升级现有Prisma项目后,我们现在将引导您完成一个从头开始的简单设置。
1. 创建一个新的Prisma项目
让我们从设置一个新的Prisma项目开始
在交互式向导中,选择以下内容
- 选择创建新数据库
- 选择PostgreSQL(或MySQL,如果您更喜欢)
- 选择您首选语言的客户端(可选,因为我们不会使用该客户端)
在通过Docker启动Prisma服务器和数据库之前,为您的数据库启用端口映射。这将允许您稍后使用本地数据库客户端(例如Postico或TablePlus)连接到数据库。
在生成的docker-compose.yml中,取消注释数据库的Docker镜像配置中的以下行
2. 定义数据模型
让我们定义一个利用Prisma新功能的数据模型。打开datamodel.prisma并将内容替换为以下内容
以下是此数据模型定义的一些重要部分
- 每个模型都映射到一个以模型名称命名但使用
@db指令小写化的表。 - 存在以下关系
- 1:1在
User和Profile之间 - 1:n在
User和Post之间 - n:m在
Post和Category之间
- 1:1在
User和Profile之间的1:1关系在User模型上用@relation(link: INLINE)指令注释。这意味着数据库中的user记录如果存在关系,则具有对profile记录的引用(因为profile字段不是必需的,所以该关系可能只是NULL)。INLINE的替代方案是TABLE,在这种情况下,Prisma将通过专用的关系表跟踪该关系。User和Post之间的1:n关系通过post表的author列进行内联跟踪,即@relation(link: INLINE)指令在Post模型的author字段上被推断。Post和Category之间的n:m关系通过一个名为PostToCategory的专用关系表进行跟踪。该关系表是数据模型的一部分,并使用@relationTable指令进行注释。- 每个模型都有一个带有
@id指令注释的id字段。 - 对于
User模型,数据库通过带有@createdAt指令注释的字段自动跟踪记录的创建时间。 - 对于
Post模型,数据库通过带有@createdAt和@updatedAt指令注释的字段自动跟踪记录的创建和更新时间。
3. 部署数据模型
在下一步中,Prisma将把这个数据模型映射到底层数据库
Category
表
索引
category_pkeyBTREETRUEidPost
表
索引
post_pkeyBTREETRUEidPostToCategory
表
索引
post_to_category_AB_uniqueBTREETRUEcategory,postpost_to_category_BBTREEFALSEpostProfile
表
索引
profile_pkeyBTREETRUEidUser
表
索引
user_pkeyBTREETRUEidhello-datamodel$dev.user.email._UNIQUEBTREETRUEemail4. 在Prisma管理界面中查看和编辑数据
从现在开始,如果您想以编程方式访问数据库中的数据,可以使用Prisma客户端。在下文中,我们将重点介绍如何使用Prisma管理界面与数据进行交互。
要访问Prisma管理界面中的数据,您需要导航到Prisma项目的管理端点:https://:4466/_admin

分享您的反馈和想法
尽管新的数据模型语法已经包含了社区要求的许多功能,但我们仍然认为有机会进一步改进它。例如,该数据模型尚未提供多列索引和多态关系。
我们目前正在开发一种新的数据建模语言,它将是当前使用的SDL的一种变体。
我们很想听听您对新数据模型的看法。请通过在反馈存储库中提交问题或加入Spectrum上的讨论来分享您的反馈。
不要错过下一篇文章!
订阅 Prisma 新闻通讯