如何以及何时为graphql生成ID?

时间:2017-11-03 09:39:40

标签: sql sqlite graphql graphql-js

我将graphql与SQLite数据库连接起来。

在sql中,id是整数,但在graphql id中是字符串。

根据此问题进行搜索后,When to use GraphQLID instead of GraphQLInt?

陈述三个建议:

  • 开始使用UUID进行PK。但是,这会影响性能。
  • 忽略隐含要求(源自relayjs生态系统),使整个应用程序中的ID唯一,并在可能的情况下将ID转换为数字以供内部使用。
  • 哈希在应用程序数据层上编码ID,例如UUID base64派生自表名和&的串联。 PK值。

建议第三个。但我不确定在何处以及如何实施它。另外,为什么graphql ID成了String?答案可能会影响ID部分的实现方式。

1 个答案:

答案 0 :(得分:10)

为什么GraphQL ID序列化与字符串相同?

作为API的数据查询语言,希望GraphQL在涉及互操作性的情况下是特定的,但一般情况下也适用于不同的用例。如果您查看answer you linked to中GraphQL规范的引用部分,您可以看到它特定于如何传递数据(“ID类型的序列化方式与字符串相同“),与 ID类型的内容无关(仅表示它”代表唯一标识符“,”通常是数字“但并非总是如此,而不是详细说明)。将ID类型序列化为字符串是提供未指定标识符数据通信的最直接方式。

因此,虽然您确实需要将ID序列化为字符串,但这些ID采用预序列化的形式取决于您,最适合您的应用程序。

如何实现序列化

如果您要与Relay.js进行交谈,其中ID需要全局唯一,那么我建议第三种方法,即连接表名和主键,然后对结果进行Base64编码。 (这就是GraphQL.js和Graphene都是这样做的。)在不了解你的应用程序的情况下,我不能多说 where 你应该进行序列化,但这里有几个例子< em>如何你可以编码ID:

# Node.js
var table_name = 'MyTable';
var primary_key = 1234;
var serialized_id = Buffer.from(table_name + ':' + primary_key).toString('base64');

# Python 3
import base64
table_name = 'MyTable'
primary_key = 1234
serialized_id = base64.b64encode((table_name + ':' + str(primary_key)).encode()).decode()

以及如何解码它们:

# Node.js
var serialized_id = 'TXlUYWJsZToxMjM0';
var [table_name, primary_key] = Buffer.from(serialized_id, 'base64').toString('ascii').split(':');

# Python 3
serialized_id = 'TXlUYWJsZToxMjM0'
(table_name, primary_key) = base64.b64decode(serialized_id.encode()).decode().split(':')

希望有所帮助!