本文屬使用Prisma構(gòu)建GraphQL服務(wù)系列侍瑟。
通過PRISMA基礎(chǔ):入門一已了解PRISMA的基礎(chǔ),現(xiàn)在我們來看看:如何部署Prisma服務(wù)袜刷,如何使用查詢(queries)和突變(mutations)訪問GraphQL API过牙。
本文主要介紹通過修改數(shù)據(jù)模型(Data Model)更新API,如下:
- 修改數(shù)據(jù)模型(Data Model)出牧;
- 部署更改以更新服務(wù)的API;
修改數(shù)據(jù)模型(Data Model)
這兩篇(PRISMA入門一 和 本文 )最后要做的事情是:如何通過修改數(shù)據(jù)模型(Data Model)以更新API歇盼。
我們希望對數(shù)據(jù)模型(Data Model)進行如下修改:
- 為
User
類型添加age
字段舔痕; - 跟蹤
User
最初創(chuàng)建或上次更新的確切時間。 - 添加新的
Post
類型及其字段豹缀。 - 在
User
和Post
類型之間創(chuàng)建一對多關(guān)系來表示一個User
可以創(chuàng)建多個Post
節(jié)點伯复。
(1) 首先將所需的字段添加到User
類型中:
type User {
id: ID! @unique
createdAt: DateTime!
updatedAt: DateTime!
name: String!
age: Int
}
age
字段的類型為Int,在User
類型上不是必須的邢笙,這意味著可以存儲年齡為空的User
節(jié)點(事實上边翼,之前創(chuàng)建的名為Sarah的User
就是這種情況)。
另一方面createdAt
和updatedAt
實際上是由Prisma管理的特殊字段鸣剪。Prisma內(nèi)部始終維護這些字段 - 但是只有在您將它們添加到數(shù)據(jù)模型中的類型定義時,它們才會暴露在您的API中(id
字段也是如此)丈积。
注意:現(xiàn)在筐骇,
createdAt
、updatedAt
江滨、id
這些字段的值是只讀的铛纬。后面可以通過常規(guī)突變(mutations)來設(shè)置這些字段的值。要了解有關(guān)此功能和時間表的更多信息唬滑,請查看此GitHub issue告唆。
此時棺弊,您所做的更改只是本地的,如果您現(xiàn)在用GraphQL Playground打開它擒悬,將無法訪問新加字段模她,因為還沒有部署。
部署修改以更新API
(2) 要使更改生效懂牧,您需要再次部署該服務(wù)侈净。在hello-world
目錄(見PRISMA入門一)中,運行以下命令:
prisma deploy
您現(xiàn)在可以打開一個新的GraphQL Playground或reload
已打開的schema
(用于reload schema
的按鈕是GraphQL API的URL旁邊的刷新按鈕)僧凤。
如上搞定后畜侦,現(xiàn)在可以訪問User
類型中新加的字段了。
(3) 試試下面這個突變(mutation)創(chuàng)建新的User
節(jié)點躯保,并設(shè)置其age
字段:
mutation {
createUser(data: {
name: "John"
age: 42
}) {
id
createdAt
updatedAt
}
}
最后旋膳,在本教程中,我們希望將Post
類型添加到數(shù)據(jù)模型中途事,并創(chuàng)建與現(xiàn)有User類型的關(guān)系验懊。
在類型之間創(chuàng)建關(guān)系非常自然(natural):您只需添加一個相關(guān)類型的新字段來表示關(guān)系的一端。關(guān)系可以 (但不必)雙向進行盯孙。
繼續(xù)鲁森,我們開始定義帶關(guān)系的新Post
類型。
(4) 打開datamodel.graphql
并添加以下類型定義:
type Post {
id: ID! @unique
title: String!
author: User!
}
(5) 要應(yīng)用這些更改振惰,您需要再次在hello-world
目錄內(nèi)運行prisma deploy
歌溉。
每篇Post
現(xiàn)在都需要一個User
節(jié)點作為其作者,這種工作方式是通過使用connect參數(shù)來進行嵌套突變(mutations)骑晶。
(6) 例如痛垛,您可以發(fā)送以下突變(mutations)以將新的Post
節(jié)點與現(xiàn)有的User
節(jié)點連接起來(您當然必須將__USER_ID__
占位符替換為用戶的實際ID):
mutation {
createPost(data: {
title: "GraphQL is awesome"
author: {
connect: {
id: "__USER_ID__"
}
}
}) {
id
}
}
我們還要添加關(guān)系的另一端,以便User
和Post
類型之間有適當?shù)囊粚Χ嚓P(guān)系桶蛔。
(7) 打開datamodel.graphql
并向User
類型添加一個名為posts
的新字段匙头,代碼如下所示:
type User {
id: ID! @unique
createdAt: DateTime!
updatedAt: DateTime!
name: String!
age: Int
posts: [Post!]!
}
就是這么簡單!新posts
字段表示由該User
創(chuàng)建的發(fā)布節(jié)點的列表仔雷。
(8) 當然蹂析,現(xiàn)在這也允許您發(fā)送嵌套查詢(queries),您要求所有User
節(jié)點以及這些User
的所有Post
節(jié)點:
{
users {
name
posts {
title
}
}
}