Prisma(四):連接本地數據庫進行增刪改查操作;Subscriptions 訂閱

之前一直說的是連接新建數據庫的情況,現在再來看看如何連接已有的數據庫,並進行CRUD。

開始

1⃣️ 初始化項目 prisma init

prisma init 項目名 開始:

  • Set up a new Prisma server or deploy to an existing server?

    • 選擇已存在的數據庫。
  • What kind of database do you want to deploy to?

    • 我用的是 MongoDB 數據庫,所以選擇 MongoDB。
  • Enter MongoDB connection string

    • connection string 需要我們寫上用戶名和密碼,所以我們先去 Robo 3T 設置一下:

      • read:允許用戶讀取指定數據庫。
      • readWrite:允許用戶讀寫指定數據庫。
      • dbAdmin:允許用戶在指定數據庫中執行管理函數,如索引創建、刪除,查看統計或訪問 system.profile。
      • userAdmin:允許用戶向 system.users 集合寫入,可以找指定數據庫裏創建、刪除和管理用戶。
      • clusterAdmin:只在 admin 數據庫中可用,賦予用戶所有分片和複製集相關函數的管理權限。
      • readAnyDatabase:只在 admin 數據庫中可用,賦予用戶所有數據庫的讀權限。
      • readWriteAnyDatabase:只在 admin 數據庫中可用,賦予用戶所有數據庫的讀寫權限。
      • userAdminAnyDatabase:只在 admin 數據庫中可用,賦予用戶所有數據庫的 userAdmin 權限。
      • dbAdminAnyDatabase:只在 admin 數據庫中可用,賦予用戶所有數據庫的 dbAdmin 權限。
      # mongodb://用戶名:密碼@數據庫服務器的主機:端口號/admin
      mongodb://censek:111@localhost:27017/admin
      
  • Please select the schema you want to introspect

    • 選擇創建 datamodel 的數據庫,我選擇的是 eportal
  • Select the programming language for the generated Prisma client

    • 語言的話,依舊選擇 JavaScript。

在這裏插入圖片描述
但是此時,datamodel.prisma 文件中並不是我選擇的數據庫的 datamodel ……

我們需要進行下一步操作 👇

2⃣️ 內省 prisma introspect

cd prisma4
prisma introspect

選擇的內容和上一步驟一樣。
在這裏插入圖片描述
可以看到已經生成了和選擇的數據庫對應的 datamodel:(就是我選的數據庫有點龐大 😂)
在這裏插入圖片描述

3⃣️ 運行

在執行命令之前,我們需要先替換一下 datamodel 的內容:
🤔 有兩種方案:
prisma.yml 文件中的 datamodel: datamodel.prisma 替換爲 datamodel: datamodel-1584930097312.prisma
② 刪除 datamodel.prisma ,把剛剛自動生成的 datamodel-1584930097312.prisma 重命名爲 datamodel.prisma

docker-compose up -d  #啓動服務器
prisma deploy

🤔 報錯,查找解決方案,有以下兩種方案:
docker-compose.yml 文件中 databases: 下:
① 直接刪除 schema: eportal (⚠️不要註釋掉)。
② 將 schema: eportal 替換爲 database: eportal
在這裏插入圖片描述

如果提示 Errors,就按着它的提示對 .prisma 文件進行修改即可。
在這裏插入圖片描述

🎺 接下來,我們換一個簡單點的數據庫進行增刪改查操作。

C

  • 分別新增兩個表的內容,利用 connect 關聯。
mutation {
  createStudent(
     data:{
       name:"小李",
     }
   ){
     _id,
     name,
   }
}

在這裏插入圖片描述

mutation {
	createJavascriptGrade(
    data:{
      student:{
        connect:{
          _id: "5e7b01b0027439000797fe87"
        }
      },
      grade:60
    }
  ){
    _id,
    student{
      name
    }
    grade
  }
}

在這裏插入圖片描述

  • 直接增加
mutation {
	createJavascriptGrade(
    data:{
      student:{
        create:{
          name: "小歐",
          number: "20190007",
          telphone: "18700000007"
        }
      },
      grade:99
    }
  ){
    _id,
    student{
      number,
      name
    }
    grade
  }
}

在這裏插入圖片描述
這個時候,“小歐” 的信息自動添加至 students 表中。

R

query {
  students{
    _id,
    number,
    name
  }
}

query 可省略。根據 DOCS 寫語句就行 😄~

{
  javascriptGrades(where:{
    student: {
      number_contains:"20190004"
    }
  }){
    student {
      number,
      name
    },
    grade
  }
}

在這裏插入圖片描述

U

mutation {
  updateStudent(
    where:{
      _id: "5e7b01b0027439000797fe87"
    }
    data: {
      number: "20190006",
      telphone: "18700000006"
    }
  ){
    number,
    name,
    telphone
  }
}

在這裏插入圖片描述

D

mutation {
  deleteJavascriptGrade(
    where:{
    	_id: "5e7b041b027439000797fe89"
    }){
    _id,
    student{
      name
    }
  }
}

在這裏插入圖片描述


Prisma GraphQL API

Prisma service 的 GraphQL API 是在 Prisma GraphQL schema 中指定的。Prisma GraphQL schema 是基於 service 的 datamodel 自動生成的:

前面的內容對 querymutation 多次使用,故下面重點來看下沒有用到的 subscriptions 訂閱

Prisma 允許我們訂閱三種不同類型的事件(datamodel 中的每種 type)。以我們常用來舉例的 Post type 來說,這些事件是:

  • 創建新 Post 節點
  • 現有 Post 節點已更新
  • 刪除現有 Post節點

Subscription type 的相應定義如下所示(此定義可在 Prisma GraphQL schema 中找到):

type Subscription {
  post(where: PostSubscriptionWhereInput): PostSubscriptionPayload
}

以下是 subscription 訂閱操作的樣子:

subscription {
  post {
    node {
      id
      title
    }
  }
}

如果沒有通過 where 參數進一步約束,則 post 訂閱將針對上述所有事件觸發。來自服務器的消息中的 PostSubscriptionPayload 包含哪些字段取決於事件的類型。

過濾特定事件

where 參數允許客戶準確指定他們感興趣的事件。也許客戶端總是隻想在 …👇 時收到更新,如:

  • Post 被刪除了
  • 一個 title 包含特定關鍵字的 Post 創建

可以使用 where 參數表達這些約束。where type 是 PostSubscriptionWhereInput

input PostSubscriptionWhereInput {
  # Filter for a specific mutation:
  # CREATED, UPDATED, DELETED
  mutation_in: [MutationType!]
  # Filter for a specific field being updated
  updatedFields_contains: String
  updatedFields_contains_every: [String!]
  updatedFields_contains_some: [String!]
  # Filter for concrete values of the Post being mutated
  node: PostWhereInput
  # Combine several filter conditions
  AND: [PostSubscriptionWhereInput!]
  OR: [PostSubscriptionWhereInput!]
}

上面提到的兩個例子可以用 Prisma API 中的以下 subscriptions 來表達:

# Only fire for _deleted_ posts
subscription {
  post(where: {
    mutation_in: [DELETED]
  }) {
    # ... we'll talk about the selection set in a bit
  }
}
# Only fire when a post whose title contains "GraphQL" is _created_
subscription {
  post(where: {
    mutation_in: [CREATED]
    node: {
      title_contains: "GraphQL"
    }
  }) {
    # ... we'll talk about the selection set in a bit
  }
}

🔍 Subscriptions 詳細介紹:https://prisma.yoga/docs/prisma1/part5#subscriptions



🔗:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章