8000 Nested jsonb in insert mutation · Issue #206 · profusion/sgqlc · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content
Nested jsonb in insert mutation #206
Open
@ryandvmartin

Description

@ryandvmartin

Hi. Having a specific issue inserting data where one of the fields is jsonb (or json). I keep getting the error:

{'errors': [{'extensions': {'path': '$.query', 'code': 'validation-failed'}, 'message': 'not a valid graphql query'}]}

where the generated sgqlc mutation looks like:

op = Operation(mutation_root)
op.insert_task_one(
    object=dict(
        created_by=10, 
        project_id=1, 
        method_kwargs={"some": "data"}, 
    )
).id()
op
>> 
mutation {
  insert_task_one(object: {created_by: 10, method_kwargs: {"some": "data"}, project_id: 1}) {
    id
  }
}

At first glance the error seems to come from the auto-generated jsonb from the schema-derived sgqlc types.

class jsonb(sgqlc.types.Scalar):
    __schema__ = schema

Building the mutation, when the jsonb field is encountered, it is dumped with json.dumps, which , of course, retains quoted dictionary keys as above. When I copy the failing query into iQL and fix the json keys to omit quotes the mutation works, e.g., changing to this is working:

mutation {
  insert_task_one(object: {created_by: 10, method_kwargs: {some: "data"}, project_id: 1}) {
    id
  }
}

This could be implemented by adding the following lines to the end of types.Scalar.__to_graphql_input__() - no idea how robust/performant this would be..

        if isinstance(value, dict):
            import re
            out = re.sub(r'"(.*?)"(?=:)', r'\1', out)
        return out

Dropping to the variable paradigm also works, though there is another quirk there on the renaming of the variable name in the mutation - if I wanted to use my schema's naming method_kwargs is automatically changed to methodKwargs in sqglc's variable setup, but the same processing is not applied to the dictionary given to the endpoint.

I guess the question is should I expect the direct usage of jsonb in my insert_task_one mutation to work? Could it work? Would this be reasonable to add?

Otherwise, thanks for the terrific project! Much appreciated

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

      0