數據模型
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)。
字段
Fields
是type
的構建塊,爲節點提供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
,選項被限制爲true
和false
)。 例如,你可以通過創建具有可能值”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! }
-