PRISMA基礎(chǔ):入門(mén)一

本文屬使用Prisma構(gòu)建GraphQL服務(wù)系列忍啸。

本教程學(xué)習(xí)如何使用Prisma對(duì)數(shù)據(jù)庫(kù)生成GraphQL API捅厂。

主要步驟如下:

  • 安裝Prisma CLI
  • 使用prisma init構(gòu)建Prisma服務(wù)
  • 使用GraphQL Playground查看API盼樟,發(fā)送查詢(xún)(queries)和突變(mutations)

安裝Prisma CLI

使用Prisma CLI管理Prisma服務(wù)贫贝。
可使用npm(或yarn)安裝喷鸽。

打開(kāi)終端工具,運(yùn)行如下命令安裝Prisma CLI:

npm install -g prisma
# or
# yarn global add prisma

構(gòu)建Prisma服務(wù)

打開(kāi)終端讼庇,跳轉(zhuǎn)到任意目錄绎巨。然后用如下命令構(gòu)建Prisma 服務(wù):

prisma init hello-world

此命令創(chuàng)建一個(gè)hello-world新目錄,包括2個(gè)必須的文件:

  • prisma.yml:服務(wù)的根配置文件蠕啄,包含有關(guān)服務(wù)的信息场勤,例如名稱(chēng)(用于生成服務(wù)的HTTP端點(diǎn)),用于保護(hù)對(duì)端點(diǎn)訪(fǎng)問(wèn)的及應(yīng)該在何處部署的secret歼跟。
  • datamodel.graphql(也可能為不同名稱(chēng)和媳,如types.graphql):此文件使用GraphQL SDL定義數(shù)據(jù)模型(data model)。

來(lái)看看生成的文件:

prisma.yml

endpoint: https://eu1.prisma.sh/public-mountainninja-311/hello-world/dev
datamodel: datamodel.graphql

注意哈街,endpoint對(duì)于會(huì)略有不同留瞳,因?yàn)?code>public-mountainninja-311是隨機(jī)生成的ID,對(duì)于部署到Sandbox的每個(gè)Prisma API都會(huì)有所不同叹卷。

以下是生成的prisma.yml中的屬性說(shuō)明:

  • endpoint:定義Prisma API的HTTP端點(diǎn);
  • datamodel:所包含數(shù)據(jù)模型的文件的路徑撼港。

datamodel.graphql

type User {
  id: ID! @unique
  name: String!
}

數(shù)據(jù)模型包含應(yīng)用程序域中實(shí)體的類(lèi)型定義。此刻骤竹,您將開(kāi)始使用帶有idname的非常??簡(jiǎn)單的User類(lèi)型帝牡。

@unique指令(directive)表示數(shù)據(jù)庫(kù)中每個(gè)Userid唯一,Prisma會(huì)始終確保其唯一蒙揣。

Prisma API現(xiàn)已部署并準(zhǔn)備好接收查詢(xún)(queries)靶溜,突變(mutations)和訂閱(subscriptions)。

使用GraphQL Playground查看API

你的API已被部署 - 但你怎么知道如何與它交互懒震?它的API實(shí)際上是什么樣的罩息?

通常,生成的API允許對(duì)數(shù)據(jù)模型中的類(lèi)型執(zhí)行CRUD操作个扰。它還公開(kāi)了GraphQL訂閱瓷炮,允許客戶(hù)訂閱特定事件并實(shí)時(shí)接收更新。

了解數(shù)據(jù)模型是API的基礎(chǔ)很重要递宅。每次對(duì)數(shù)據(jù)模型進(jìn)行更改(并運(yùn)行prisma deploy之后)時(shí)娘香,GraphQL API都會(huì)相應(yīng)更新苍狰。

由于您的數(shù)據(jù)模型包含User類(lèi)型,因此Prisma API現(xiàn)在允許其客戶(hù)端創(chuàng)建烘绽,讀取淋昭,更新和刪除該類(lèi)型的實(shí)例(也稱(chēng)為節(jié)點(diǎn)nodes)。尤其是安接,現(xiàn)在基于User類(lèi)型生成以下GraphQL操作:

  • user:通過(guò)其id查詢(xún)(或另一個(gè)@unique字段)檢索單個(gè)User節(jié)點(diǎn)
  • users:查詢(xún)以檢索User節(jié)點(diǎn)列表翔忽。
  • createUser: 突變(Mutation)創(chuàng)建一個(gè)新的User節(jié)點(diǎn)。
  • updateUser: 突變(Mutation)更新現(xiàn)存User節(jié)點(diǎn)盏檐。
  • deleteUser: 突變(Mutation) 刪除現(xiàn)存User節(jié)點(diǎn)歇式。

注意:以上操作列表不完整。 Prisma API公開(kāi)了多個(gè)操作糯笙,例如贬丛,允許批量更新/刪除許多節(jié)點(diǎn)。但是给涕,所有操作都可以創(chuàng)建豺憔,讀取,更新或刪除數(shù)據(jù)模型中定義的類(lèi)型的節(jié)點(diǎn)够庙。

要實(shí)際使用這些操作恭应,您需要一種將請(qǐng)求發(fā)送到服務(wù)API的方法。由于該API通過(guò)HTTP公開(kāi)耘眨,因此您可以使用curl或Postman等工具與之交互昼榛。但是,GraphQL實(shí)際上具有更好的工具:GraphQL Playground剔难,一種交互式GraphQL IDE胆屿。

要打開(kāi)GraphQL Playground,可以再次使用Prisma CLI偶宫。只需在hello-world目錄中運(yùn)行以下命令:

prisma playground

這將打開(kāi)一個(gè)GraphQL Playground非迹,如下圖:


GraphQL Playground

注意:Playground可以作為獨(dú)立的桌面應(yīng)用程序安裝在您的機(jī)器上。如果您沒(méi)有安裝Playground纯趋,該命令會(huì)自動(dòng)在您的默認(rèn)瀏覽器中打開(kāi)一個(gè)Playground憎兽。

GraphQL API的一個(gè)非常酷的特性是它們有效地自我說(shuō)明吵冒。 GraphQL Scheme定義了API的所有操作纯命,包括輸入?yún)?shù)和返回類(lèi)型。這允許像GraphQL Playground這樣的工具自動(dòng)生成API文檔痹栖。

要查看Prisma API的文檔亿汞,請(qǐng)單擊Playground窗口右邊緣上的綠色SCHEMA按鈕

這帶來(lái)了Playground的文檔窗格揪阿。最左邊的列是API接受的所有操作的列表留夜。然后匙铡,您可以深入了解每個(gè)操作涉及的輸入?yún)?shù)或返回類(lèi)型的詳細(xì)信息图甜。

GraphQL API Documents

發(fā)送查詢(xún)和突變(queries and mutations)

好吧碍粥!借助迄今為止學(xué)到的一切,您已準(zhǔn)備好針對(duì)您的API發(fā)布一些查詢(xún)和突變(queries and mutations)黑毅。讓我們從users查詢(xún)開(kāi)始嚼摩,檢索當(dāng)前存儲(chǔ)在數(shù)據(jù)庫(kù)中的所有User節(jié)點(diǎn)。 在左邊的Playground窗格中輸入以下查詢(xún)矿瘦,然后單擊Play按鈕(或使用快捷鍵CMD + Enter):

query {
  users {
    name
  }
}

此時(shí)枕面,服務(wù)器只返回一個(gè)空列表。這并不奇怪缚去,因?yàn)槲覀兊侥壳盀橹惯€沒(méi)有實(shí)際創(chuàng)建任何User節(jié)點(diǎn)潮秘。因此,讓我們改變它易结,并使用createUser突變將第一個(gè)User節(jié)點(diǎn)存儲(chǔ)在數(shù)據(jù)庫(kù)中枕荞。

在Playground中打開(kāi)一個(gè)新選項(xiàng)卡,在左邊的Play中輸入以下突變:

mutation {
  createUser(data: {
    name: "Sarah"
  }) {
    id
  }
}

這一次搞动,服務(wù)器的響應(yīng)實(shí)際上包含了一些數(shù)據(jù)(請(qǐng)注意躏精,當(dāng)服務(wù)器在創(chuàng)建時(shí)為每個(gè)新節(jié)點(diǎn)生成一個(gè)全局唯一的ID時(shí),該ID當(dāng)然會(huì)有所不同)

{
  "data": {
    "createUser": {
      "id": "cjc69nckk31jx01505vgwmgch"
    }
  }
}

您現(xiàn)在可以返回到users查詢(xún)的前一個(gè)選項(xiàng)卡鹦肿,并再次發(fā)送查詢(xún)矗烛。
這次,剛剛創(chuàng)建的User節(jié)點(diǎn)在服務(wù)器響應(yīng)中返回:

users

請(qǐng)注意箩溃,API還提供強(qiáng)大的過(guò)濾瞭吃,排序和分頁(yè)功能。以下是為user查詢(xún)提供相應(yīng)輸入?yún)?shù)的查詢(xún)示例涣旨。

檢索name包含字符串“ra”的所有User節(jié)點(diǎn)

query {
  users(where: {
    name_contains: "ra"
  }) {
    id
    name
  }
}

檢索按name降序排列的所有User節(jié)點(diǎn)

query {
  users(orderBy: name_DESC) {
    id
    name
  }
}

檢索一部分User節(jié)點(diǎn)(列表中的位置20-29)

query {
  users(skip: 20, first: 10) {
    id
    name
  }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末歪架,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子开泽,更是在濱河造成了極大的恐慌牡拇,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,807評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件穆律,死亡現(xiàn)場(chǎng)離奇詭異惠呼,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)峦耘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)剔蹋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人辅髓,你說(shuō)我怎么就攤上這事泣崩∩倭海” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,589評(píng)論 0 363
  • 文/不壞的土叔 我叫張陵矫付,是天一觀(guān)的道長(zhǎng)凯沪。 經(jīng)常有香客問(wèn)我,道長(zhǎng)买优,這世上最難降的妖魔是什么妨马? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,188評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮杀赢,結(jié)果婚禮上烘跺,老公的妹妹穿的比我還像新娘。我一直安慰自己脂崔,他們只是感情好滤淳,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,185評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著砌左,像睡著了一般脖咐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上绊困,一...
    開(kāi)封第一講書(shū)人閱讀 52,785評(píng)論 1 314
  • 那天文搂,我揣著相機(jī)與錄音,去河邊找鬼秤朗。 笑死煤蹭,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的取视。 我是一名探鬼主播硝皂,決...
    沈念sama閱讀 41,220評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼作谭!你這毒婦竟也來(lái)了稽物?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 40,167評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤折欠,失蹤者是張志新(化名)和其女友劉穎贝或,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體锐秦,經(jīng)...
    沈念sama閱讀 46,698評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡咪奖,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,767評(píng)論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了酱床。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片羊赵。...
    茶點(diǎn)故事閱讀 40,912評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖扇谣,靈堂內(nèi)的尸體忽然破棺而出昧捷,到底是詐尸還是另有隱情闲昭,我是刑警寧澤,帶...
    沈念sama閱讀 36,572評(píng)論 5 351
  • 正文 年R本政府宣布靡挥,位于F島的核電站序矩,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏芹血。R本人自食惡果不足惜贮泞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,254評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望幔烛。 院中可真熱鬧,春花似錦囊蓝、人聲如沸饿悬。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,746評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)狡恬。三九已至,卻和暖如春蝎宇,著一層夾襖步出監(jiān)牢的瞬間弟劲,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,859評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工姥芥, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留兔乞,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,359評(píng)論 3 379
  • 正文 我出身青樓凉唐,卻偏偏與公主長(zhǎng)得像庸追,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子台囱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,922評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容