Graphene with Flask 不加载模式
Graphene with Flask doesn't load schema
我正在尝试 运行 this example 将 Graphene 与 Flask 结合使用。我从该页面逐字制作 models.py
、schema.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。
这是我对 graphene 或 graphql 的第一次体验,我确信它最终会成为一个愚蠢的错误。任何帮助将不胜感激!
非常感谢,
亚历克斯
您需要至少为您的 schema
对象提供一个 query
对象,否则没有什么可以通过 GraphQL "expose"。
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)
谢谢伊万!您的回复让我走上了正确的轨道,我会将其标记为正确答案,但解决方案甚至更简单。
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()
处失败。简单的解决方案是将该行移到末尾并将查询 class 交给它,因此将文件更改为:
# 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)
然后该示例似乎按预期工作。我认为这是教程中的错误,应该在石墨烯网站上更改。
我正在尝试 运行 this example 将 Graphene 与 Flask 结合使用。我从该页面逐字制作 models.py
、schema.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。
这是我对 graphene 或 graphql 的第一次体验,我确信它最终会成为一个愚蠢的错误。任何帮助将不胜感激!
非常感谢, 亚历克斯
您需要至少为您的 schema
对象提供一个 query
对象,否则没有什么可以通过 GraphQL "expose"。
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)
谢谢伊万!您的回复让我走上了正确的轨道,我会将其标记为正确答案,但解决方案甚至更简单。
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()
处失败。简单的解决方案是将该行移到末尾并将查询 class 交给它,因此将文件更改为:
# 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)
然后该示例似乎按预期工作。我认为这是教程中的错误,应该在石墨烯网站上更改。