【问题标题】:How to execute graphql query for a specific schema in hasura?如何在 hasura 中对特定模式执行 graphql 查询?
【发布时间】:2021-12-19 13:28:27
【问题描述】:

如下图所示,当前项目数据库(postgresql) 命名为 default 有这 4 个架构 - public、appcompany1、appcompany2 和 appcompany3。

他们共享一些公用表。现在,当我想为客户获取数据时,我会编写这样的查询:

query getCustomerList {
    customer {
        customer_id
        ...
        ...
    }
}

它从公共架构中获取所需的数据。

但根据需求,根据前端的用户交互情况,将为appcompanyN(N=1,2,3,...,任意正整数)执行该查询。我该如何实现这个目标?

注意:每当用户创建新公司时,都会为该公司创建一个新架构。所以schema的总数不限于4个。

【问题讨论】:

    标签: postgresql graphql hasura


    【解决方案1】:

    我怀疑您看到的问题实际上并不存在。

    一切都比看起来简单得多。

    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{
       }
    }
    

    appcompany1appcompany2appcompanyZ替换[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
       }
    }
    

    关于这两种解决方案:很难说它们是优雅的。

    我自己都不喜欢他们两个;)

    所以你自己决定哪个更适合你的情况。

    【讨论】:

      猜你喜欢
      • 2021-08-19
      • 2020-08-13
      • 2019-11-23
      • 2020-04-26
      • 2020-01-12
      • 2020-01-23
      • 2020-07-02
      • 2020-11-14
      • 1970-01-01
      相关资源
      最近更新 更多