使用Graphene执行突变时获取记录的全局ID

亚历克西斯·罗兰

我正在使用python包Flask,SQLAlchemy,Graphene和Graphene-SQLAlchemy构建GraphQL API。我遵循了SQLAlchemy + Flask教程我能够执行变异来创建记录,并且我想在API的响应中获取此记录的全局ID:

这是为突变实现的类:

from graphql_relay.node.node import to_global_id
import api_utils # Custom methods to create records in database
import batch_schema
import graphene


class CreateBatchOwnerInput(graphene.InputObjectType):
    """Input to create batch owner."""
    name = graphene.String(required=True)


class CreateBatchOwner(graphene.Mutation):
    """Create batch owner."""
    class Arguments:
        input = CreateBatchOwnerInput(required=True)

    # Class attributes
    batch_owner = graphene.Field(batch_schema.BatchOwner)

    @staticmethod
    def mutate(root, info, input=None):
        """Method to create batch owner."""
        record = {'name': input.name}
        batch_owner = api_utils.create('BatchOwner', record)  # This returns a dictionary {'id': int, 'name': string}
        batch_owner = batch_schema.BatchOwner(**batch_owner)
        batch_owner.id = to_global_id('BatchOwner', batch_owner.id)  # Convert database Id to global Id
        return CreateBatchOwner(batch_owner=batch_owner)

以下突变可以正常工作

mutation Mutation {
    createBatchOwner(input: {name:"Jake"}) {
        batchOwner {
          name
        }
    }
}

response:

{
  "data": {
    "createBatchOwner": {
      "batchOwner": {
        "name": "Jake"
      }
    }
  }
}

但是,当我在有效负载中添加“ id”字段时,会收到以下错误消息:

mutation Mutation {
    createBatchOwner(input: {name:"Antoine"}) {
        batchOwner {
          id
          name
        }
    }
}

response:

{
  "data": {
    "createBatchOwner": {
      "batchOwner": null
    }
  },
  "errors": [
    {
      "message": "'BatchOwner' object has no attribute '__mapper__'",
      "locations": [
        {
          "column": 11,
          "line": 4
        }
      ]
    }
  ]
}

这是Flask应用程序生成的日志:

Traceback (most recent call last):
  File "/home/alexis/data-quality-venv/lib/python3.5/site-packages/graphql/execution/executor.py", line 311, in resolve_or_error
    return executor.execute(resolve_fn, source, info, **args)
  File "/home/alexis/data-quality-venv/lib/python3.5/site-packages/graphql/execution/executors/sync.py", line 7, in execute
    return fn(*args, **kwargs)
  File "/home/alexis/data-quality-venv/lib/python3.5/site-packages/graphene/relay/node.py", line 38, in id_resolver
    type_id = parent_resolver(root, info, **args)
  File "/home/alexis/data-quality-venv/lib/python3.5/site-packages/graphene_sqlalchemy/types.py", line 160, in resolve_id
    keys = self.__mapper__.primary_key_from_instance(self)
AttributeError: 'BatchOwner' object has no attribute '__mapper__'
Traceback (most recent call last):
  File "/home/alexis/data-quality-venv/lib/python3.5/site-packages/graphql/execution/executor.py", line 330, in complete_value_catching_error
    exe_context, return_type, field_asts, info, result)
  File "/home/alexis/data-quality-venv/lib/python3.5/site-packages/graphql/execution/executor.py", line 405, in complete_value
    return complete_object_value(exe_context, return_type, field_asts, info, result)
  File "/home/alexis/data-quality-venv/lib/python3.5/site-packages/graphql/execution/executor.py", line 504, in complete_object_value
    return execute_fields(exe_context, return_type, result, subfield_asts)
  File "/home/alexis/data-quality-venv/lib/python3.5/site-packages/graphql/execution/executor.py", line 148, in execute_fields
    source_value, field_asts)
  File "/home/alexis/data-quality-venv/lib/python3.5/site-packages/graphql/execution/executor.py", line 247, in resolve_field
    result
  File "/home/alexis/data-quality-venv/lib/python3.5/site-packages/graphql/execution/executor.py", line 324, in complete_value_catching_error
    return complete_value(exe_context, return_type, field_asts, info, result)
  File "/home/alexis/data-quality-venv/lib/python3.5/site-packages/graphql/execution/executor.py", line 383, in complete_value
    raise GraphQLLocatedError(field_asts, original_error=result)
graphql.error.located_error.GraphQLLocatedError: 'BatchOwner' object has no attribute '__mapper__'
亚历克西斯·罗兰

我已经解决了该问题,并在教程中对此进行了记录。

Flask-Graphene-SQLAlchemy教程

看来我的mutate方法和SQLAlchemy类的定义都没有正确定义。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

单击弹出选项时如何获取行ID(使用全局变量获取ID)?

使用Include()时如何通过id获取单条记录

使用event.target.id从bind(id)获取ID时意外使用'event'无限制全局变量

在 MySQL 中使用 count 来获取单个记录 ID 时是否有可能

Django / Graphene突变不适用

记录的全局唯一ID

如何在商店突变中获取全局变量

CreateQuery 在执行 SQL INSERT 命令时返回新记录的 id

使用基于ID的条件获取最早的记录

使用实体框架按ID获取记录

使用休眠条件获取最大ID的记录

如何从突变中获取新对象的ID?

在 Loopback 上,如何在使用从访问令牌获取的 user_id 时执行 Upsert 事件?

使用react-apollo(GraphQL)进行插入突变,如何获取本地商店更新的插入ID?

当无法使用group_by时,对列进行突变以获取组中非NA值的最小值

对表的最后一条记录执行条件并获取该记录的ID

使用LINQ执行GroupBy和Union来获取记录

使用 django-graphene 时出现错误

使用NavigationPage时获取“ iOS上不全局支持PushAsync ...”

使用tf.train.MonitoredTrainingSession时如何获取全局步

插入后触发,插入记录时发生错误表突变

全局地图突变

使用Graphene和SQLAlchemy通过GraphQL API更新记录

在graphql中执行多个突变时正确的错误处理

使用vuex模块时如何测试突变

使用 LIMIT 和 OFFSET 时使用 SQL 获取记录数

获取全局参数的 Javascript 自执行函数

使用LINQ根据记录ID获取最大的DataGridViewRow

使用mysql中的最近记录获取组的所有ID