我怀疑您看到的问题实际上并不存在。
一切都比看起来简单得多。
A.所有这些表在哪里?
有很多架构,其中包含相同(或几乎相同)的对象。
所有表都在 hasura 中注册。
Hasura 不能用相同的名称注册不同的表,因此默认名称将是 [schema_name]_[table_name](public 除外)
所以表customer将被注册为:
-
customer(来自public)
appcompany1_customer
appcompany2_customer
appcompany3_customer
可以使用“自定义 GraphQL 根字段”在 GraphQL 模式中自定义实体名称。
B.问题
但根据需求,根据前端的用户交互情况,将为appcompanyN(N=1,2,3,...,任意正整数)执行该查询。我该如何实现这个目标?
有相同的对象,不同之处仅在于模式名称的前缀。
所以解决方案是微不足道的
1。动态 GraphQL 查询
应用程序存储 GraphQL 查询的模板,并在请求之前用真实的模式名称替换前缀。
例如
query getCustomerList{
[schema]_customer{
}
}
用appcompany1、appcompany2、appcompanyZ替换[schema]并执行。
2。所有数据的 SQL 视图
如果表 100% 相同,则可以将 sql 视图创建为:
CREATE VIEW ALL_CUSTOMERS
AS
SELECT 'public' as schema,* FROM public.customer
UNION ALL
SELECT 'appcompany1' as schema,* FROM appcompany1.customer
UNION ALL
SELECT 'appcompany2' as schema,* FROM appcompany2.customer
UNION ALL
....
SELECT `appcompanyZ',* FROM appcompanyZ.customer
这样:不需要动态查询,不需要在所有模式中注册所有对象。
您只需要使用组合数据注册视图并使用一个查询
query{
query getCustomerList($schema: string) {
all_customer(where: {schema: {_eq: $schema}}){
customer_id
}
}
关于这两种解决方案:很难说它们是优雅的。
我自己都不喜欢他们两个;)
所以你自己决定哪个更适合你的情况。