生成动态 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的主要内容,如果未能解决你的问题,请参考以下文章
动态代理与Scala反射/Java反射在JavaScalaKotlin中的使用