Python Graphene运行报Unknown argument "__annotations__"错误排查
问题产生原因
- 直接原因:你使用了PEP 526 变量类型注解语法(
username: graphene.String(required=True))定义Mutation的入参,你当前安装的graphene版本不支持该写法。旧版本graphene解析Arguments类属性时,会将Python自动生成的__annotations__魔法属性识别为未知参数,抛出对应错误。 - 附加错误1:mutate方法中错误实例化了Graphene的
UserTypeSchema映射类,该类不能直接添加到SQLAlchemy会话中,需要实例化你定义的User数据库模型类。 - 附加错误2:CreateUser类未定义返回字段
ok和user,参数问题修复后运行也会抛出字段不存在的错误;且UUID生成逻辑错误,uuid.UUID()用于解析已有UUID字符串,生成新UUID需调用uuid.uuid4()方法。
修复方案
- 替换Arguments类中的类型注解写法为旧版赋值写法,或升级graphene到支持类型注解的最新版本
- 补充CreateUser类的返回字段定义
- 修正模型实例化和UUID生成逻辑
- 简化Mutation字段注册参数,避免不必要的传参错误
修正后的完整代码示例:
import uuid import graphene from graphene_sqlalchemy import SQLAlchemyObjectType from api import db # 替换为你实际的User模型导入路径 from your_model_path import User class UserType(SQLAlchemyObjectType): class Meta: model = User class CreateUser(graphene.Mutation): # 定义返回字段 ok = graphene.Boolean() user = graphene.Field(UserType) class Arguments: # 替换类型注解为赋值写法 username = graphene.String(required=True) def mutate(root, info, username): # 实例化数据库模型类 user = User( username=username, # 生成UUID并转为字符串存储 userId = str(uuid.uuid4()) ) db.session.add(user) db.session.commit() return CreateUser(ok=True, user=user) class Mutation(graphene.ObjectType): create_user_mutation = CreateUser.Field( description="creating a new user by providing the username." ) # 确保Query类已按业务逻辑正确定义 schema = graphene.Schema(query=Query, mutation=Mutation)
内容的提问来源于stack exchange,提问作者crispengari
相关产品推荐
相关产品推荐

