我正在将 graphql 与 SQLite 数据库连接。
在 sql 中,id 是整数,但在 graphql 中,id 是字符串。
经过搜索,基于这个问题——何时使用 GraphQLID 而不是 GraphQLint? https://stackoverflow.com/questions/39471075/when-to-use-graphqlid-instead-of-graphqlint
提出三点建议:
- 开始使用 UUID 进行 PK。然而,这会对性能产生影响。
- 忽略在整个应用程序中具有唯一 ID 的隐含要求(源自 Relayjs 生态系统),并在可能的情况下将 ID 转换为数字以供内部使用。
- 应用程序数据层上的哈希编码 ID,例如UUID base64 源自表名称和 PK 值的串联。
并且推荐第三种。但我不确定在哪里以及如何实施它。另外,为什么 graphql ID 是字符串?答案可能会影响该 ID 部分的实现方式。
为什么 GraphQL ID 的序列化与字符串相同?
作为 API 的数据查询语言,GraphQL 在涉及互操作性时最好是特定的,但在其他方面是通用的,以适应不同的用例。如果您查看 GraphQL 规范中引用的部分回答你链接到的 https://stackoverflow.com/a/39472164,你可以看到它具体是关于how数据进行通信(“ID 类型的序列化方式与字符串相同”),同时不具体说明whatID类型的内容是(仅说它“代表唯一标识符”,“通常是数字”,但并不总是如此,无需详细说明)。将 ID 类型序列化为字符串是提供其他未指定标识符数据通信的最直接方法。
因此,虽然您确实需要将 ID 序列化为字符串,但这些 ID 采取什么形式预序列化取决于您,因为这最适合您的应用程序。
如何实现序列化
如果您要使用像 Relay.js 这样的东西,其中 ID 需要全局唯一,那么我建议使用第三种方法,即连接表名和主键,然后对结果进行 Base64 编码。 (这就是 GraphQL.js 和 Graphene 的做法。)在不了解有关您的应用程序的更多信息的情况下,我无法说太多where你应该进行序列化,但这里有几个例子how你可以对 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(':')
希望有帮助!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)