Hanums

Hanums

GraphQL JSON data type

I have json type field on Postgres and trying to create object type in GraphQL but compiler issuing error:

== Compilation error in file lib/community_web/schema.ex ==
** (Absinthe.Schema.Error) Invalid schema:
/Users/kishore/CodeLearning/Elixir/community/lib/community_web/schema.ex:21: Values :json is not defined in your schema.

Types must exist if referenced.

lib/absinthe/schema.ex:271: Absinthe.Schema.__after_compile__/2
(stdlib) lists.erl:1263: :lists.foldl/3
(stdlib) erl_eval.erl:680: :erl_eval.do_apply/6
(elixir) lib/kernel/parallel_compiler.ex:206: anonymous fn/4 in Kernel.ParallelCompiler.spawn_workers/6

Here is object definition:
object :field_values do
field :id, non_null(:id)
field :name, :string
field :description, :string
field :values, :json
end

Do I need to create custom object type? but as per the documentation http://graphql-elixir.org/docs/basic-types/ :json is data type.

Please help.

Marked As Solved

axelson

axelson

Scenic Core Team

http://graphql-elixir.org/docs/basic-types/ is the documentation for graphql | Hex but it looks like you are using absinthe | Hex

In Absinthe :json is not built-in and you need to add it to your project manually. Generally speaking you want to be cautious on over-relying on untyped JSON in GraphQL, but a JSON field in Postgres sounds like a good use case to me :+1:

Here are the instructions for adding a custom JSON type in Absinthe:

Also Liked

sorentwo

sorentwo

Oban Core Team

The json db type may have an array or a map with unstructured keys. Unstructured data is strictly forbidden in GraphQL, so you’ll need to work around it. You have two primary options:

  1. If you are storing semi-structures data in the field (like a list of strings, of a map with a few possible keys), then make an object with those fields.
  2. If you have arbitrary data in there then you can send it as a string and have the client decode it.

In our primary GraphQL API we use both of these techniques.

One caveat, if you do go with option 2: enforce the size of the arbitrary data that can be stored. For example, if you have a meta field with client provided values you should restrict the serialized JSON to a fixed length. We do this and limit data to 1024 characters.

gregvaughn

gregvaughn

I don’t know GraphQL well enough to try to help with the immediate problem, but there is a deeper conceptual problem going on here. JSON is not a data type. It is an encoding format. Even though that is the “field type” in the database, you conceptually have some sort of business domain type you are storing that way. That business domain type is what you should expose via GraphQL.

Exposing your field as a “json type” is basically working against the GraphQL goal of specifying your types explicitly. If you are not very careful, this will become a maintenance problem over time.

Last Post!

Hanums

Hanums

Thanks much for advise, got your point.

Where Next?

Popular in Questions Top

joaquinalcerro
Hi there, I am working with Ecto-Postgresql and I need to call all of the records from a specific table but the table has 40,000 records...
New
lanycrost
Hi everyone! I need implement if…else if…else condition from my elixir code, and anymore of this control flow structures not work proper...
New
PeterCarter
There are pre-rolled solutions for other frameworks that do work. However, Phoenix does not seem to have these. Have people had good expe...
New
Darmani72
If I have a post route which an argument: post /my_post_route/:my_param1, MyController.my_post_handler How would get the post params ...
New
Patoshizzle
After calling mix ecto.create I get this error: 17:00:32.162 [error] GenServer #PID<0.412.0> terminating ** (Postgrex.Error) FATAL...
New
svb
Hi! Currently I want to submit a form by pressing the Enter key. However, since my input field is of type “textarea” this is just adds a...
New
Harrisonl
We have an ECS cluster with 4 services, where each task joins a single cluster, via discovery ECS discovery service. Currently when I de...
New

Other popular topics Top

JakeBecker
TL;DR: I’ve just released an implementation of Microsoft’s IDE-independent Language Server Protocol for Elixir. It adds language support ...
1144 54996 245
New
gshaw
What is the idiomatic way of matching for not nil in Elixir? E.g., First way: defp halt_if_not_signed_in(conn, signed_in_account) when...
New
gausby
I asked this very same question on twitter and got some interesting feedback, but I thought it would be a good question to ask here as we...
1207 40082 209
New
AstonJ
Seen any cool LiveView demos, sample apps or examples? Please post them here! :003:
New
AngeloChecked
What learn first? Rust or Elixir Hi Elixir community! I’m here because i want learn a new language. I’m a junior developer and mainly i ...
New
TunkShif
This post is an instruction guide to help you setup your Neovim for Elixir development from scratch. It includes general information on h...
274 42576 114
New

We're in Beta

About us Mission Statement