当前位置: 首页 > 工具软件 > Prisma > 使用案例 >

Prisma(三)——数据模型

鲜于煜祺
2023-12-01

数据模型

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!
      }
      
 类似资料: