生成动态 GraphQL Schema

Posted

技术标签:

【中文标题】生成动态 GraphQL Schema【英文标题】:Generate dynamic GraphQL Schema 【发布时间】:2020-12-08 23:02:13 【问题描述】:

我正在创建一个系统,其中没有。表中的列数不固定。我会用一个例子来解释。

考虑一个包含 3 列的人员表。

people
----------
id | name | email

该表将公开给 GraphQL API,我可以查询该表。在我的系统中,用户将能够将自定义列添加到人员表中。假设他们添加了一个国籍列。当他们这样做时,国籍在 API 中将不可用,因为它没有在 Schema 中定义。

那么如何使我的架构动态化,以允许用户使用他们添加的每个额外列来查询 people 表?

【问题讨论】:

【参考方案1】:

我可以查询 information_schema 表或 fields 表并获取 people 表的额外字段,然后使用 GraphQLObjectType 来构建我的模式,而不是使用 SDL。

【讨论】:

【参考方案2】:

这不是您问题的答案,而是建议,因为在 SQL 中创建动态列对我来说不是一个好主意。我认为您应该重新考虑您的数据库结构,而不是思考如何创建动态架构。

与其在Person 表中添加新列,不如为自定义列创建不同的表,例如创建person_columns

person_columns
----------
id | people_id | column_name | column_value

因此,对于每个人,您都可以拥有多个列及其对应的值,并且您不必担心动态创建您的 graphQL 模式。 (根据您的要求,您可以向person_columns 表添加更多列以进行更多控制)

【讨论】:

我已经考虑过这个解决方案。最初我开发了类似的东西,但是我的列将是另一个表中的外键,因此我不必重复 column_name。但这带来了一些问题。我必须执行 CROSSTAB 或 PIVOT 查询才能以有效的方式获取我想要的信息,这非常昂贵。此外,我仍然需要查询 person_columns 表来构建 graphQL 架构。

以上是关于生成动态 GraphQL Schema的主要内容,如果未能解决你的问题,请参考以下文章

生成动态 GraphQL Schema

动态代理与反射在GraphQL客户端的应用

动态代理与Scala反射/Java反射在JavaScalaKotlin中的使用

如何使用 Apollo 在 Nuxt 生成的动态页面中正确填充页眉?

GraphQL 查询,具有动态字段

如何从 GraphQL 生成 Dart - graphql 到 dart 生成器