本文属使用Prisma构建GraphQL服务系列。
通过PRISMA基础:入门一已了解PRISMA的基础,现在我们来看看:如何部署Prisma服务,如何使用查询(queries)和突变(mutations)访问GraphQL API。
本文主要介绍通过修改数据模型(Data Model)更新API,如下:
- 修改数据模型(Data Model);
- 部署更改以更新服务的API;
修改数据模型(Data Model)
这两篇(PRISMA入门一 和 本文 )最后要做的事情是:如何通过修改数据模型(Data Model)以更新API。
我们希望对数据模型(Data Model)进行如下修改:
- 为
User
类型添加age
字段; - 跟踪
User
最初创建或上次更新的确切时间。 - 添加新的
Post
类型及其字段。 - 在
User
和Post
类型之间创建一对多关系来表示一个User
可以创建多个Post
节点。
(1) 首先将所需的字段添加到User
类型中:
type User {
id: ID! @unique
createdAt: DateTime!
updatedAt: DateTime!
name: String!
age: Int
}
age
字段的类型为Int,在User
类型上不是必须的,这意味着可以存储年龄为空的User
节点(事实上,之前创建的名为Sarah的User
就是这种情况)。
另一方面createdAt
和updatedAt
实际上是由Prisma管理的特殊字段。Prisma内部始终维护这些字段 - 但是只有在您将它们添加到数据模型中的类型定义时,它们才会暴露在您的API中(id
字段也是如此)。
注意:现在,
createdAt
、updatedAt
、id
这些字段的值是只读的。后面可以通过常规突变(mutations)来设置这些字段的值。要了解有关此功能和时间表的更多信息,请查看此GitHub issue。
此时,您所做的更改只是本地的,如果您现在用GraphQL Playground打开它,将无法访问新加字段,因为还没有部署。
部署修改以更新API
(2) 要使更改生效,您需要再次部署该服务。在hello-world
目录(见PRISMA入门一)中,运行以下命令:
prisma deploy
您现在可以打开一个新的GraphQL Playground或reload
已打开的schema
(用于reload schema
的按钮是GraphQL API的URL旁边的刷新按钮)。
如上搞定后,现在可以访问User
类型中新加的字段了。
(3) 试试下面这个突变(mutation)创建新的User
节点,并设置其age
字段:
mutation {
createUser(data: {
name: "John"
age: 42
}) {
id
createdAt
updatedAt
}
}
最后,在本教程中,我们希望将Post
类型添加到数据模型中,并创建与现有User类型的关系。
在类型之间创建关系非常自然(natural):您只需添加一个相关类型的新字段来表示关系的一端。关系可以 (但不必)双向进行。
继续,我们开始定义带关系的新Post
类型。
(4) 打开datamodel.graphql
并添加以下类型定义:
type Post {
id: ID! @unique
title: String!
author: User!
}
(5) 要应用这些更改,您需要再次在hello-world
目录内运行prisma deploy
。
每篇Post
现在都需要一个User
节点作为其作者,这种工作方式是通过使用connect参数来进行嵌套突变(mutations)。
(6) 例如,您可以发送以下突变(mutations)以将新的Post
节点与现有的User
节点连接起来(您当然必须将__USER_ID__
占位符替换为用户的实际ID):
mutation {
createPost(data: {
title: "GraphQL is awesome"
author: {
connect: {
id: "__USER_ID__"
}
}
}) {
id
}
}
我们还要添加关系的另一端,以便User
和Post
类型之间有适当的一对多关系。
(7) 打开datamodel.graphql
并向User
类型添加一个名为posts
的新字段,代码如下所示:
type User {
id: ID! @unique
createdAt: DateTime!
updatedAt: DateTime!
name: String!
age: Int
posts: [Post!]!
}
就是这么简单!新posts
字段表示由该User
创建的发布节点的列表。
(8) 当然,现在这也允许您发送嵌套查询(queries),您要求所有User
节点以及这些User
的所有Post
节点:
{
users {
name
posts {
title
}
}
}