在尝试使用Python进行GraphQL开发时遇到的问题

我之前使用RESTFul API进行了各种实现,但是开始担心API散布在各种服务器上和查询次数等问题,于是决定采用GraphQL来解决这些问题。
在学习过程中遇到了很多不懂的地方,所以打算记下我遇到的困难点。

使用Python的GraphQL

我认为在Python中,可以使用的库基本上只有Graphene。除此之外,我没有特别在寻找其他的库。
由于我们公司使用的DBMS是SQLServer,所以选择了SQLAlchemy作为ORM。考虑到不需要过重的框架,我们选择了Flask作为我们的Web框架。

步骤一:环境准备

基本环境

    • MacOS Sierra 10.12.6

 

    • Homebrew 1.5.11

 

    • virtualenv 15.1.0

 

    Python 3.6.1

需求清单

aniso8601==3.0.0
click==6.7
Flask==0.12.2
Flask-GraphQL==1.4.1
graphene==2.1
graphene-sqlalchemy==2.0.0
graphql-core==2.0
graphql-relay==0.4.5
inflect==0.2.5
iso8601==0.1.12
itsdangerous==0.24
Jinja2==2.10
MarkupSafe==1.0
promise==2.1
pyodbc==4.0.23
Rx==1.6.1
singledispatch==3.4.0.3
six==1.11.0
sqlacodegen==1.1.6
SQLAlchemy==1.2.6
typing==3.6.4
Werkzeug==0.14.1

第二步。教程。

image.png

按照教程进行操作,虽然能够完成动作,但会遇到一些不明白的问题。

“Connection是指什么?”

在初始教程中,涉及到了“edge”和“node”这两个关键词。看起来它们是由Graphene的Connection对象生成的。

石墨烯连接
在石墨烯中,连接(Connection)被写作是对列表进行扩展,并提供切片和分页功能。
一开始我对此没有概念,费了不少劲,但通过阅读下文的文章,我大致理解了。

GraphQL入门 – 引人入胜的GraphQL GraphQL服务器规范

总结起来,GraphQL的Connection似乎提供了重新获取对象的机制。对于可能频繁添加或数据量较大的数据,使用Connection而非List似乎更合适。

步骤3. 要将Connection用作实用工具

虽然Connection为我们设置了分页机制,这真是太好了,但是当我希望更详细地创建筛选器时,我感觉graphene提供的功能还不够充分。

如果列出主要想做的事情的话

    • 値による比較(完全一致、範囲、文字列パターン、など)

 

    順序の指定

关于这一点,似乎只能继承并扩展Graphene的连接。在StackOverflow上,有很多关于如何设置查询并进行扩展、如何定义FilterQuery对象等的回答。如何进行筛选和限制?

有些代码可以以公开Alchemy模型的方式进行筛选,但这样做可能并不理想哈哈。似乎需要创建一个可以根据连接定义的机制。

顺便提一句,如果用Django来做的话,似乎可以使用一个叫做Django-filter的库来实现大部分需求。
至于在SQLAlchemy中如何实现最佳方式,我并不很清楚,看来需要发明或发现一种方法。请问有人能告诉我一个好的方法吗?

步骤4. 关于变量的定义

在Graphene中,您可以自由地编写类似方法的查询。

请你帮我开门。(Can you help me open the door?)

请你给我打电话。(Can you call me?)

请你把这个盒子拿给我。(Can you bring me this box?)

query {
  getUser(name: "Hoge") {
    user {
      id
      name
    }
  }
}

我在寻找一种好的设计方法,这样就可以通过在Graphene中添加需要查询的字段来实现。目前我觉得Github的API是最好的选择。

步骤5. 关于突变处理

这个机制很简单。我认为在一定程度上需要内部的设计是无可避免的。

第六步骤:会话权限。

在处理会话和权限方面,最好是由Flask等上层框架来处理,如果可能的话,最好根据账户权限来区分入口点。

在我的情况下,由于各种原因,我决定按照以下的结构来安排。

graphql-application
 |
 --- schema
 |
 --- admin-schema
 |
 --- model
 |
 app.py

总结

一开始,我打算宣传说「用GraphQL来构建API很简单!」,但是在尝试过后,我发现「这个真的挺麻烦的」,感觉有很多困难。
除非先对GraphQL本身有一定的了解,否则会很辛苦。
我得去学习一下……

草案
GraphQL学习会数据

广告
将在 10 秒后关闭
bannerAds