I am building an application using:
As I am building out my GraphQL schema I'm using the GraphQL ID data type to uniquely identify records. Here's an example schema and its MySQL resolver/connector
Graphql Type:
type Person { id: ID! firstName: String middleName: String lastName: String createdAt: String updatedAt: String }
Sequelize connector
export const Person = sequelize.define('person', { firstName: { type: Sequelize.STRING }, middleName: { type: Sequelize.STRING }, lastName: { type: Sequelize.STRING }, });
GraphQL resolver:
Query: { person(_, args) { return Person.findById(args.id); }
So that all works. Here's my question. GraphQL seems to treat the ID
type as a string. While the ID value gets stored in the MySQL database as an INT
by Sequelize. I can use GraphQL to query the MySQL db with either a string or a integer that matches the ID value in the database. However, GraphQL will always return the ID value as a string.
How should I be handling this value in the client? Should I always convert it to an integer as soon as I get it from GraphQL? Should I modify my sequelize code to store the ID value as a string? Is there a correct way to proceed when using GraphQL IDs like this?
GraphQL seems to treat the ID type as a string. While the ID value gets stored in the MySQL database as an INT by Sequelize. I can use GraphQL to query the MySQL db with either a string or a integer that matches the ID value in the database. However, GraphQL will always return the ID value as a string.
To provide options for GraphQL clients to elegantly handle caching and data refetching, GraphQL servers need to expose object identifiers in a standardized way. For this to work, a client will need to query via a standard mechanism to request an object by ID.
ID : The ID scalar type represents a unique identifier, often used to refetch an object or as the key for a cache. The ID type is serialized in the same way as a String; however, defining it as an ID signifies that it is not intended to be human‐readable.
ID
is a scalar type described in the GraphQL specification (working draft October 2016):
The ID type is serialized in the same way as a String; however, it is not intended to be human‐readable. While it is often numeric, it should always serialize as a String.
Your observation
I can use GraphQL to query the MySQL db with either a string or a integer that matches the ID value in the database. However, GraphQL will always return the ID value as a string.
is aligned with the specification about result coercion:
GraphQL is agnostic to ID format, and serializes to string to ensure consistency across many formats ID could represent
and input coercion:
When expected as an input type, any string (such as "4") or integer (such as 4) input value should be coerced to ID as appropriate for the ID formats a given GraphQL server expects
How should I be handling this value in the client?
ID
results, treat them as strings.ID
inputs (in GraphQL variables or input parameters for mutations or queries), you can either use integers or strings.Should I always convert it to an integer as soon as I get it from GraphQL?
That's highly depending on your application. There is no general rule that dictates a clear "yes" or "no" here.
Should I modify my sequelize code to store the ID value as a string?
No, that's not required.
The GraphQL specification about the ID
type does not cover how you store the ids, only how a GraphQL server is expected to treat ID
input and output. It's up to the GraphQL layer to ensure this behaviour. How ids are handled in the actual storage is up to the storage layer.
Is there a correct way to proceed when using GraphQL IDs like this?
I hope the above answers also answer this question :)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With