0

我正在尝试运行此示例以将 Graphene 与 Flask 一起使用。我从该页面逐字制作models.pyschema.py和,并按照说明app.py将它们全部放入flask_sqlalchemy文件夹中。然后我使用底部列出的说明创建并填充数据库。

一切都很顺利,直到我尝试跑步app.py。当我这样做时,它给了我这个错误:

Traceback (most recent call last):
  File "./app.py", line 6, in <module>
    from schema import schema, Department
  File "C:\Users\asdf\Python\GraphQL\flask_sqlalchemy\schema.py", line 7, in <module>
    schema = graphene.Schema()
  File "C:\Users\asdf\Envs\GraphQL\lib\site-packages\graphene\types\schema.py", line 27, in __init__
    ).format(query)
AssertionError: Schema query must be Object Type but got: None.

所以基本上它失败了schema.py,说:

schema = graphene.Schema()

事实上,如果我打开命令提示符并执行此操作,它会以同样的方式失败:

>>> import graphene
>>> s  = graphene.Schema()
Traceback... (same traceback)

我在 Windows 10 上使用 Python 3.5。与本教程的唯一区别是我使用virtualenvwrapper-win而不是常规的 virtualenv。

这是我对石墨烯或 graphql 的第一次体验,我确信这最终会成为一个愚蠢的错误。任何帮助将不胜感激!

非常感谢,亚历克斯

4

2 回答 2

1

您需要至少query为您的对象提供一个对象schema,否则没有任何东西可以通过 GraphQL “公开”。

class Employee(SQLAlchemyObjectType):

    class Meta:
        model = EmployeeModel


class Query(graphene.ObjectType):

    employee = graphene.Field(
        Employee, 
        employee_id=graphene.Argument(graphene.Integer)
    )

    def resolve_employee(self, args, context, info):
        """Resolves `employee` object on the root query"""
        employee_id = args.get('employee_id')
        employee = EmployeeModel.query.get(employee_id)
        return employee

# Provide the root query to schema
schema = graphene.Schema(query=query)
于 2017-07-25T04:37:01.783 回答
0

谢谢伊万!您的回答使我走上了正确的轨道,我将其标记为正确答案,但解决方案更加简单。

schema.py在教程中是这样的:

# flask_sqlalchemy/schema.py
import graphene
from graphene import relay
from graphene_sqlalchemy import SQLAlchemyObjectType, SQLAlchemyConnectionField
from models import db_session, Department as DepartmentModel, Employee as EmployeeModel

schema = graphene.Schema()

class Department(SQLAlchemyObjectType):
    class Meta:
        model = DepartmentModel
        interfaces = (relay.Node, )

class Employee(SQLAlchemyObjectType):
    class Meta:
        model = EmployeeModel
        interfaces = (relay.Node, )

class Query(graphene.ObjectType):
    node = relay.Node.Field()
    all_employees = SQLAlchemyConnectionField(Employee)

schema.query = Query

但正如 Ivan 指出的那样,该graphene.Schema()函数需要处理一个查询,所以它在schema = graphene.Schema(). 简单的解决方案是将该行移至末尾并将其交给 Query 类,因此将文件更改为:

# flask_sqlalchemy/schema.py
import graphene
from graphene import relay
from graphene_sqlalchemy import SQLAlchemyObjectType, SQLAlchemyConnectionField
from models import db_session, Department as DepartmentModel, Employee as EmployeeModel

class Department(SQLAlchemyObjectType):
    class Meta:
        model = DepartmentModel
        interfaces = (relay.Node, )

class Employee(SQLAlchemyObjectType):
    class Meta:
        model = EmployeeModel
        interfaces = (relay.Node, )

class Query(graphene.ObjectType):
    node = relay.Node.Field()
    all_employees = SQLAlchemyConnectionField(Employee)

schema = graphene.Schema(query = Query)

然后该示例似乎按预期工作。我认为这是教程中的一个错误,应该在 Graphene 网站上进行更改。

于 2017-07-25T16:01:02.310 回答