作者:mobiledu2502874483 | 来源:互联网 | 2023-01-10 13:21
我将graphql与SQLite数据库连接起来.
在sql中,id是整数,但在graphql id中是字符串.
搜索之后,基于这个问题 - 何时使用GraphQLID而不是GraphQLInt?
说明有三个建议:
开始使用UUID进行PK.但是,这会影响性能.
忽略隐式需求(源自relayjs生态系统)以使ID在整个应用程序中唯一,并在可能的情况下将ID转换为数字以供内部使用.
哈希在应用程序数据层上编码ID,例如,从表名和PK值的串联派生的UUID base64.
它建议第三个.但我不确定在何处以及如何实施它.另外,为什么graphql ID成了String?答案可能会影响ID部分的实现方式.
1> Sean Bolton..:
为什么GraphQL ID序列化与字符串相同?
作为API的数据查询语言,希望GraphQL在涉及互操作性的情况下是特定的,但通常用于适应不同的用例.如果您在链接的答案中查看 GraphQL规范的引用部分,您可以看到它是如何传达数据的("ID类型与字符串的序列化方式相同"),而非特定的关于ID类型的内容是什么(仅表示它"代表唯一标识符","通常是数字"但不总是,而不是详细说明).使ID类型序列化为字符串是提供否则未指定的标识符数据的通信的最直接的方式.
因此,虽然您确实需要将ID序列化为字符串,但这些ID采用预序列化的形式取决于您,最适合您的应用程序.
如何实现序列化
如果您要与Relay.js进行交谈,其中ID需要全局唯一,那么我建议第三种方法,即连接表名和主键,然后Base64对结果进行编码.(这就是GraphQL.js和Graphene的工作方式.)在不了解应用程序的更多信息的情况下,我不能多说你应该在哪里进行序列化,但这里有一些关于如何编码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(':')
希望有所帮助!