Prisma(三)——數據模型

數據模型

datamodel定義概述

datamodel有兩個主要功能:

  • 定義底層數據庫模式和表。
  • 它是Prisma API的自動生成的CRUD和實時操作代碼的基礎。

構建數據模型的塊

有幾個可用的構建塊來塑造你的數據模型:

  • Types由多個fields字段組成,通常表示應用程序中的實體(例如User,Car,Order)。數據模型中的每種類型都映射到數據庫表,並且將CRUD操作添加到GraphQL schema中。
  • Relations描述類型之間的relationship關係。
  • Directives指令涵蓋不同的用例,例如類型約束或級聯刪除行爲。
  • Interfaces是抽象類型,包括一組字段,類型必須包含在implement接口中。接口目前不適用於Prisma中的數據建模,但將來會支持待實現功能。

爲什麼選擇SDL?

SDL用於數據建模的主要原因有兩個:

  • SDL是一種 直觀,簡潔的表達類型定義的方式,因此有助於提供良好的開發人員體驗。
  • 使用GraphQL SDL定義用作GraphQL API基礎的模型是一種 慣用的方法。

對象類型type

object type(簡稱 type)定義數據模型中一個model的結構。 它用於表示應用領域中的實體。

每個對象類型都映射到數據庫。 對於關係數據庫,每種類型創建一個table。 對於無模式數據庫,使用等效結構(例如document)。 請注意,即使對於無模式數據庫,Prisma也會強制執行模式!

  • 定義對象類型

    在datamodel中使用關鍵字"type"定義對象類型:

    type Article {
      id: ID! @id
      title: String!
      text: String
      isPublished: Boolean! @default(value: false)
    }
    

    上面定義的類型具有以下屬性:

    • Name: Article

    • Fields: id, title, text , isPublished (默認爲 false)

    • id , title , isPublished 是必填字段 (被後面的 ! 符號定義), text 可選填.

    • 所有ID 都必須是@unique。

  • 生成type的API操作

    數據模型中的類型會影響Prisma API中的可用操作。Prisma API中每種類型生成的CRUD和實時操作的概述如下所示:

    • Query:獲取該類型的一個或多個節點。
    • Mutation:創建,更新或刪除該類型的節點。
    • Subscription:收到有關該類型節點更改的實時通知(即新節點是created或現有節點是updated或deleted)。

字段

Fieldstype的構建塊,爲節點提供shape。每個字段都由其名稱引用,並且是標量關係字段。字段名稱只能包含字母數字字符,需要以小寫字母開頭。它們可以包含 最多64個字符。

  • Scalar fields(標量字段)

    • String

      • 🌰

        type User {
          name: String
        }
        
      • 當在操作中用作參數時,必須使用引號括起來指定String字段:

        query {
          user(name: "Anna") {
            id,
            name
          }
        }
        
    • Integer

      • 🌰

        type User {
          age: Int
        }
        
      • 當在操作中用作參數時,寫Int字段不能包含任何封閉字符:

        query {
          user(age: 18) {
            id,
            name
          }
        }
        
    • Float

      • 🌰

        type Product {
          price: Float
        }
        
      • 當在操作中用作參數時,寫Float字段,不帶任何封閉字符,小數點可選:

        query {
          Product(price: 42.2) {
            id,
            name
          }
        }
        
    • Boolean

      • 🌰

        type User {
          overEighteen: Boolean
        }
        
      • 當在操作中用作參數時,寫Boolean字段,不帶任何封閉字符,小數點可選:

        query {
          user(overEighteen: true) {
            id
          }
        }
        
    • DateTime
      DateTime類型可用於存儲日期/或時間值。可能是一個人的出生日期或特定事件發生時的時間/數據。

      • 🌰

        type User {
          birthday: DateTime
        }
        
      • 當在操作中用作參數時,指定DateTime字段,並帶有引號:

        query {
          user(birthday: "2020-1-5"){
            id,
            name,
            birthday
          }
        }
        
    • Enum

      像"Boolean“一樣,枚舉可以有一組預定義的值。 區別在於你可以定義可能的值(而對於Boolean,選項被限制爲truefalse)。 例如,你可以通過創建具有可能值”COMPACT","WIDE“和”COVER"的枚舉來指定文章的格式。`枚舉值只能包含 字母數字字符和下劃線,並且需要以大寫字母開頭。 枚舉值的名稱可用於查詢過濾器和Mutation。 它們可以包含 最多191個字符。

      • 🌰

        enum ArticleFormat {
          COMPACT,
          WIDE,
          COVER
        }
        type Article {
          format: ArticleFormat
        }
        
      • 當在操作中用作參數時,必須在不包含引號的情況下指定枚舉字段:

        query {
          article(format: COMPACT) {
            id
          }
        }
        
    • Json

      有時可能需要爲鬆散結構化的數據存儲任意JSON值。 Json類型確保它實際上是有效的JSON並將值作爲解析的JSON對象/數組而不是字符串返回。Json值目前限制爲256KB

      • 🌰

        type Item {
          data: Json
        }
        
      • 當在操作中用作參數時,必須使用雙引號括起來指定的Json字段。 特殊字符必須被轉義: json: "{"int": 1, "string": "value"}"

        mutation {
          createItem(data: "{"int": 1, "string": "value"}") {
            data
          }
        }
        
    • ID
      @id指令註釋的ID類型的字段是系統字段,並由Prisma維護。每個模型只能使用@id註釋一個ID字段:

      type User {
        id: ID! @id
      }
      
  • 類型修飾符

    在字段定義中,可以使用類型修飾符對類型進行註釋。 SDL支持兩種類型修飾符:

    • List:使用一對封閉的[]來註釋類型,例如: friends: [User]
      一般在一對多關係中使用List。可以使用列表字段類型標記標量字段。 具有多重性的關係字段也將被標記爲列表。

      type Article {
        tags: [String!]! @scalarList(strategy: RELATION)
      }
      

      注意兩個!類型修飾符:

      • 第一個!類型修飾符(在String之後)意味着列表中的任何項都不能爲"null",例如 tags的這個值無效:["Software",null,"GraphQL"]
      • 第二個!類型修飾符(在結束方括號之後)意味着列表本身永遠不能爲"null",但它可能是empty。 因此,null不是tags字段的有效值,而[]是。

      注意:,所有一對多關係,必須有兩個!,不然prisma deploy時會報錯,因爲返回值不能爲null,用!後返回值哪怕爲空也是[]。 ❓❓❓

    • Required fields:使用!註釋類型,例如: name:String!

      可以將字段標記爲必填字段(也稱爲“不可爲空”)。必填字段用標記,在字段類型之後:

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