一个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】

  • 连接节点页面信息更改为接口iconnectioniedge等。
  • 实现默认的连接页面信息对象
  • 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的支持

初始值

待办事项

  • 测试
  • 特拉维斯
  • 更多测试
  • 请帮助测试:

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java使用不安全的方法复制整个C结构?   java JavaFx表格视图滚动错误   java应该向应用服务器或数据库添加逻辑吗   java小程序参数标记的用途是什么?   扩展AbstractTestNGSpringContextTests时,java Autowired spring依赖项在抽象基类中始终为空   java1。4关于java版本1.3到1.4   java MVC循环依赖   Java中的oauth电子邮件同步   java Facebook/Parse登录行为异常:代理应用程序尚未安装   java JPA不持久化对象J2EE   如何使用java读取和修改存储在FTP服务器上的图像文件   java测试时为什么要创建/删除testdatabase?   CriteriaBuilder查询中不区分java重音   使用Java从http url获取文件扩展名   Java多维数组/打印空值   java Javax持久性无法在maven上编译   使用mac地址的java制造商名称   java将图像旋转到“指向”鼠标位置   tiff如何打开一个非常大的幻灯片图像,如下所示。使用Java的tif图像文件?   内存Java:是否将Xms设置为XX:PermSize或XX:MaxPermSize?