datamodel
有两个主要功能:
CRUD
和实时操作代码的基础。有几个可用的构建块来塑造你的数据模型:
Types
由多个fields字段组成,通常表示应用程序中的实体(例如User,Car,Order)。数据模型中的每种类型都映射到数据库表,并且将CRUD操作添加到GraphQL schema中。Relations
描述类型之间的relationship关系。Directives
指令涵盖不同的用例,例如类型约束或级联删除行为。Interfaces
是抽象类型,包括一组字段,类型必须包含在implement接口中。接口目前不适用于Prisma中的数据建模,但将来会支持待实现功能。SDL用于数据建模的主要原因有两个:
SDL
是一种 直观,简洁的表达类型定义的方式,因此有助于提供良好的开发人员体验。GraphQL SDL
定义用作GraphQL API基础的模型是一种 惯用的方法。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!
}