Graphql-SQL不同

司徒泰
2023-12-01

GraphQL

特点:
1.请求需要的数据,不多不少。(Restful会返回所有的数据)
2.获取多个资源,只用一个请求
3.描述所有可能类型的系统,便于维护。

GraphQL与restful的对比
1.restful一个接口只能返回一个资源,graphql一次可以获得多个资源
2.restful用不同的url来区分资源,graphql用类型区分资源

使用express+GraphQL需要注意
构建schema,这里定义查询的语句和类型

var schema=bulidSchema(
	type Query{
	hello: String
	}
);

定义查询所对应的resolver,也就是查询对应的处理器

var root ={
	hello :() =>{
		return "Hello world!";
	},
};

Fields:查询一个对象的字段
1.在对象上面选取字段,如果返回的还是对象,那么可以在这个字段里面进行查询。在restful里面查询可能就会返回所有的字段。
2.还可以进行嵌套查询

举例
查询条件

{
  hero{
    name
    friends{
      name
    }
  }
}

返回的数据

{
  "data": {
    "hero": {
      "name": "R2-D2",
      "friends": [
        {
          "name": "Luke Skywalker"
        },
        {
          "name": "Han Solo"
        },
        {
          "name": "Leia Organa"
        }
      ]
    }
  }
}

Arguments:使用查询参数筛选结果

原始数据库查询:select *from Customers where country=‘Meico’
Graphql查询

{
  human(id:"1000"){
    	name
    height
  }
}

Graphql结果

{
  "data": {
    "human": {
      "name": "Luke Skywalker",
      "height": 1.72
    }
  }
}

hero同名查询需要重命名字段避免冲突
举例

{
	empireHero:hero(episode:EMPIRE){
    name
  }
  jediHero:hero(episode:JEDI){
    name
  }
}
{
  "data": {
    "empireHero": {
      "name": "Luke Skywalker"
    },
    "jediHero": {
      "name": "R2-D2"
    }
  }
}

Fragments:复用查询片段

{
	empireHero:hero(episode:EMPIRE){
    ... heroFields
  }
  jediHero:hero(episode:JEDI){
    ... heroFields
  }
  
  fragment heroFields on Character
  {
    name
    appearsIn
    friends{
      name
    }
  }
}

Operation Name:给你的查询起个有意义的名字

query HeroNameAndFriends
{
  hero{
    name
    friends{
      name
    }
  }
}

mutation:修改数据(同一个数据查询修改后的数据)
举例:

mutation{
  createReview(episode:JEDI,review:{stars:3}){
    episode
    stars
  }
}
{
  "data": {
    "createReview": {
      "episode": "JEDI",
      "stars": 3
    }
  }
}

Inline Fragments:用内联片段查询具体类型

{
  search(text:"an"){
    __typename
    ... on Human{
      name
      height
    }
    ... on Starship{
      name
      length
    }
  }
}
 类似资料: