一个python graphql库,使用新的async/await语法来使用类型提示和并发支持。
typegql的Python项目详细描述
键入gql
一个python GraphQL库,使用新的async/await语法来使用类型提示和并发支持。
免责声明
这个库还处于初级阶段,因此请谨慎使用,并可以随意贡献。
安装
pipinstalltypegql
用法
下面演示如何使用typegql实现图书库的graphql api。 示例可以在typegql/core/examples中找到,您可以通过执行python <path_to_example>/server.py
定义查询
fromtypingimportListfromtypegql.core.graphimportGraph,Connectionfromtypegql.examples.library.typesimportAuthor,Categoryfromtypegql.examples.library.typesimportBookfromtypegql.examples.libraryimportdbclassQuery(Graph):books:List[Book]=Field()authors:List[Author]=Field()categories:List[Category]=Field()books_connection:Connection[Book]=Field(description='Relay connection')asyncdefresolve_authors(self,info,**kwargs):returndb.get('authors')asyncdefresolve_books(self,info,**kwargs):returndb.get('books')asyncdefresolve_categories(self,info,**kwargs):returndb.get('categories')asyncdefresolve_books_connection(self,info,**kwargs):data=db.get('books')return{'edges':[{'node':node}fornodeindata]}
定义您的类型
fromdataclassesimportdataclassfromdatetimeimportdatetimefromdecimalimportDecimalfromenumimportEnumfromtypingimportListfromtypegqlimportField,ID,OptionalField,ReadonlyFieldfromtypegql.core.graphimportGraphfromexamples.libraryimportdbclassGender(Enum):MALE='male'FEMALE='female'classGeoLocation(Graph):latitude:Decimal=Field()longitude:Decimal=Field()def__init__(self,latitude,longitude):self.latitude=latitudeself.longitude=longitude@dataclassclassAuthor(Graph):"""Person that is usually a writer"""id:ID=ReadonlyField()name:str=Field()gender:Gender=OptionalField()geo:GeoLocation=OptionalField()@dataclassclassCategory(Graph):id:ID=ReadonlyField()name:str=Field()@dataclassclassBook(Graph):"""A book... for reading :|"""id:ID=ReadonlyField()author_id:ID=Field()title:str=OptionalField()author:Author=ReadonlyField(description='The author of this book')categories:List[Category]=OptionalField()published:datetime=OptionalField()tags:List[str]=OptionalField()def__post_init__(self):self.published=datetime.strptime(self.published,'%Y-%m-%d %H:%M:%S')asyncdefresolve_author(self,info):data=filter(lambdax:x['id']==self.author_id,db.get('authors'))data=next(data)author=Author(**data)author.gender=Gender[author.gender.upper()].valueif'geo'indata:author.geo=GeoLocation(**data.get('geo'))returnauthorasyncdefresolve_categories(self,selections,name=None):data=filter(lambdax:x['id']inself.categories,db.get('categories'))fordindata:# showcasing async generatoryieldCategory(**d)defresolve_tags(self,selections):return['testing','purpose']
改为使用字段
您可以使用以下字段定义GraphQL架构:
Field,InputField,RequiredField,OptionalField
例如:
fromtypegqlimportField,Connection,OptionalFieldclassQuery(Graph):authors:Author=Field()categories:Category=Field(description="what's this?")books_connection:Connection[Book]=OptionalField()
运行查询
fromtypegql.core.schemaimportSchemafromexamples.library.queryimportQueryschema=Schema(Query)query=''' query BooksConnection { books_connection { edges { node { id title published author { id name } } } } } '''asyncdefrun():result=awaitschema.run(query)
客户机
typegql支持dsl客户端使用graphql api。 客户端自动将snake转换为camelcase。如果不需要设置camelcase=false
pipinstalltypegql[client]
例如:
fromtypegql.clientimportClientasyncwithClient(url,camelcase=True)asclient:awaitclient.introspection()dsl=client.dslquery=dsl.Query.books_connection.select(dsl.BooksConnection.total_count)doc=dsl.query(query)status,result=awaitclient.execute(doc)
更改日志
2.0.6【2019-06-24】
- 更新uvloop依赖项
2.0.5【2019-04-24】
- 修正了发送内省模式时的错误
2.0.4【2019-04-24】
- 使用状态和结果更新assert for introspection add message
- 添加对resolve_field_velue_or_error中枚举对象的支持
2.0.3【2019-02-08】
- 将连接、边、节点和页面信息更改为接口iconnection、iedge等。
- 实现默认的连接和页面信息对象
- 从pageinfo中删除下一个,上一个
2.0.1【2019-01-19】
- 没有为其分配字段实例的所有属性都将被模式忽略
- 更新文档和示例以反映2.0的更改
- 修正了在突变中使用list参数时的错误
1.0.7【2018-12-09】
-
修复错误< /LI>
- 在客户端添加对camelcase的支持
1.0.1【2018-11-19】
- 增加对客户端DSL的支持
初始值
- 添加了graphql-core-next作为所有graphql操作的基线
待办事项
- 测试
- 特拉维斯
- 更多测试
- 请帮助测试: