api 除了查询功能外还需要写入,在 graphql 里面,写入要用 Mutation。
回到我们的 schema 本体,把它改成:schema = graphene.Schema(query=Query, mutation=Mutation)
新增一个 Mutation class,整份 schema.py 现在长这样:
import graphenefrom collections import namedtuple from .schemaClass.playDataSchema import playDataSchema #---- 新增以下 ----------------------from .mutations.writePlayData import writePlayData as writePlayDataMutation#-----------------------------------from api.api.playData import playDatafrom api.api.writePlayData import writePlayDataclass Query(graphene.ObjectType): reverse = graphene.String(word=graphene.String(default_value='t')) def resolve_reverse(self, info, word): print(self) return 'hello' playData = graphene.List(playDataSchema, name = graphene.String()) # playData = graphene.NonNull(playDataSchema, name = graphene.String()) def resolve_playData(self, info, name): data = playData( {'name': name} )['data'] if len(data) > 0: # --- 转成 namedtuple --- outDataNT = namedtuple('myData', [ key for key in data[0] ]) outData = [ outDataNT(**eachData) for eachData in data ] # ---------------------- return outData else: return []#---- 新增以下 ----------------------class Mutation(graphene.ObjectType): writePlayData = writePlayDataMutation.Field() def resolve_writePlayData(self, info): return writePlayDataMutation #------------------------------------schema = graphene.Schema(query=Query, mutation=Mutation)
在这次变动中,我们从 mutation 资料夹里的 writePlayData 档案中 import 了一个 Mutation 的 class,并把它命名为 writePlayDataMutation (现在还没有这个档案,我们等下再来创建它)。
然后新增了 Mutation 类别作为 mutation 的中枢,当使用者想要 writePlayData 时我们返回给它刚刚 import 的 mutation 类别, writePlayDataMutation.Field()
可以把它当成是将 mutation 类别降级成跟 string 类别一样,才能放进 graphene.ObjectType 类别里面。
创建一个资料夹 mutations 来放置所有的 mutation 文件,并创立
__init.py
跟 writePlayData.py
。writePlayData.py
的内容如下:
import graphenefrom api.api.writePlayData import writePlayData as writePlayDataFuncclass writePlayData(graphene.Mutation): class Arguments: name = graphene.String() lv = graphene.Int() skill = graphene.String() status = graphene.Boolean() err = graphene.String() def mutate(self, info, name, lv, skill): data = writePlayDataFunc( { 'name': name, 'lv': lv, 'skill': skill } ) status = data['status'] err = data['err'] return writePlayData(status=status, err=err)
writePlayDataFunc
是一只可以写入资料库的 api 并且会返回 { status, err }, status 代表有没有写入成功。
接下来讲解 graphene.Mutation 的架构:
在 mutation 这个类别里,有三个元素
class writePlayData(graphene.Mutation):# 第一个元素: 写入所需要的参数----------------- class Arguments: name = graphene.String() lv = graphene.Int() skill = graphene.String()#-------------------------------------------# 第二个元素: 可以返回给使用者的资料 ---------- status = graphene.Boolean() err = graphene.String()#-------------------------------------------# 第三个元素: 实际执行写入,并回传值 ---------- def mutate(self, info, name, lv, skill): data = writePlayDataFunc( { 'name': name, 'lv': lv, 'skill': skill } ) status = data['status'] err = data['err'] return writePlayData(status=status, err=err) #注意这边是 call 自己#-------------------------------------------
在 mutation 里面,class Arguments:
跟 def mutate():
是必要的,没有的话会报错。
接下来 run 伺服器后就可以看到成果啰