You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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用户,无法获取所有已创建的用户,请问这是为什么?


原因与解决方法

核心问题

你的代码存在两个关键问题:

  1. 没有持久化存储创建的用户:CreateUser的mutate方法里创建的User对象只是临时变量,执行完mutation后就被销毁,没有保存到任何可复用的容器中。
  2. users查询硬编码返回固定数据:resolve_users方法直接返回写死的dummy用户列表,完全没有读取实际创建的用户数据。

修复步骤

  1. 添加全局存储容器:用一个全局列表保存所有用户,初始可以包含预设的dummy用户。
  2. 修改mutation逻辑:创建新用户后,将其存入全局存储容器。
  3. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 10:10:04