Python中GraphQL查询无法获取全部用户的问题求助
问题:GraphQL Mutation创建的用户无法通过users查询返回
我编写了如下Python GraphQL代码:
import graphene import json from datetime import datetime import uuid class User(graphene.ObjectType): id = graphene.ID(default_value=str(uuid.uuid4())) username = graphene.String() createdAt = graphene.DateTime(default_value=datetime.now()) class Query(graphene.ObjectType): user = graphene.Field(User, username=graphene.String()) users = graphene.List(User) def resolve_users(self, info): return [ { "id":"b79b64e2-d391-4778-91b9-4d7496cbf418", "username":"dummy", "createdAt": "2022-09-03T20:07:35.611815" } ] def resolve_user(self, info, username): return User(username=username) class CreateUser(graphene.Mutation): user = graphene.Field(User) class Arguments: username = graphene.String() def mutate(self, info, username): user = User(username=username) return CreateUser(user=user) class Mutation(graphene.ObjectType): create_user = CreateUser.Field() schema = graphene.Schema(query=Query , mutation=Mutation) # Create new user. result = schema.execute( ''' mutation{ createUser(username:"ayuse"){ user{ id username createdAt } } } ''' ) # Create new user. result = schema.execute( ''' mutation{ createUser(username:"mahmud"){ user{ id username createdAt } } } ''' ) # Query the properties of a specific user. result = schema.execute( ''' { user(username: "ayuse") { username id createdAt } } ''' ) data = dict(result.data.items()) print(json.dumps(data,indent=2)) print("---") # Request the ids for all of the users (This is not working). result = schema.execute( ''' { users { id } } ''' ) data = dict(result.data.items()) print(json.dumps(data,indent=2))
执行后得到如下输出:
{ "user": { "username": "ayuse", "id": "0c158313-f914-4276-8ff7-019f745e8d30", "createdAt": "2022-09-03T20:32:40.633433" } } --- { "users": [ { "id": "b79b64e2-d391-4778-91b9-4d7496cbf418" } ] }
我通过mutation创建了ayuse和mahmud两个用户,但执行users查询时仅能返回预设的dummy用户,无法获取所有已创建的用户,请问这是为什么?
原因与解决方法
核心问题
你的代码存在两个关键问题:
- 没有持久化存储创建的用户:
CreateUser的mutate方法里创建的User对象只是临时变量,执行完mutation后就被销毁,没有保存到任何可复用的容器中。 - users查询硬编码返回固定数据:
resolve_users方法直接返回写死的dummy用户列表,完全没有读取实际创建的用户数据。
修复步骤
- 添加全局存储容器:用一个全局列表保存所有用户,初始可以包含预设的dummy用户。
- 修改mutation逻辑:创建新用户后,将其存入全局存储容器。
- 修改users查询解析方法:让它返回全局存储里的所有用户。
修复后的代码示例:
import graphene import json from datetime import datetime import uuid # 全局存储用户的列表,初始包含dummy用户 users_storage = [ { "id":"b79b64e2-d391-4778-91b9-4d7496cbf418", "username":"dummy", "createdAt": "2022-09-03T20:07:35.611815" } ] class User(graphene.ObjectType): id = graphene.ID(default_value=str(uuid.uuid4())) username = graphene.String() createdAt = graphene.DateTime(default_value=datetime.now()) class Query(graphene.ObjectType): user = graphene.Field(User, username=graphene.String()) users = graphene.List(User) def resolve_users(self, info): # 返回全局存储里的所有用户 return users_storage def resolve_user(self, info, username): # 从全局存储中查找指定用户名的用户 for user in users_storage: if user["username"] == username: return user # 如果没找到,创建新用户并存入存储 new_user = User(username=username) users_storage.append({ "id": new_user.id, "username": new_user.username, "createdAt": new_user.createdAt.isoformat() }) return new_user class CreateUser(graphene.Mutation): user = graphene.Field(User) class Arguments: username = graphene.String() def mutate(self, info, username): user = User(username=username) # 将新用户添加到全局存储 users_storage.append({ "id": user.id, "username": user.username, "createdAt": user.createdAt.isoformat() }) return CreateUser(user=user) class Mutation(graphene.ObjectType): create_user = CreateUser.Field() schema = graphene.Schema(query=Query , mutation=Mutation) # Create new user. result = schema.execute( ''' mutation{ createUser(username:"ayuse"){ user{ id username createdAt } } } ''' ) # Create new user. result = schema.execute( ''' mutation{ createUser(username:"mahmud"){ user{ id username createdAt } } } ''' ) # Query the properties of a specific user. result = schema.execute( ''' { user(username: "ayuse") { username id createdAt } } ''' ) data = dict(result.data.items()) print(json.dumps(data,indent=2)) print("---") # Request the ids for all of the users (Now it works). result = schema.execute( ''' { users { id username createdAt } } ''' ) data = dict(result.data.items()) print(json.dumps(data,indent=2))
说明
- 这里用全局列表
users_storage作为临时存储,实际生产环境中建议使用数据库(如SQLite、PostgreSQL)做持久化存储。 - 修改后,
resolve_users会返回所有已存储的用户,mutate方法会把新创建的用户存入列表,users查询就能获取到所有创建的用户了。
内容的提问来源于stack exchange,提问作者mbilyanov
相关产品推荐
相关产品推荐

