Как выполнить запрос graphql для определенной схемы в hasura?

#postgresql #graphql #hasura

Вопрос:

Как видно на следующем снимке экрана, текущая база данных проекта (postgresql) с именем по умолчанию имеет эти 4 схемы — public, appcompany1, appcompany2 и appcompany3.

Консоль Hasura

У них есть несколько общих столов. Прямо сейчас, когда я хочу получить данные для клиентов, я пишу такой запрос:

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

И он извлекает необходимые данные из общедоступной схемы.

Но в соответствии с требованиями, в зависимости от взаимодействия с пользователем в интерфейсе, этот запрос будет выполнен для appcompanyN (N=1,2,3,…, любое положительное целое число). Как мне достичь этой цели?

ПРИМЕЧАНИЕ.Всякий раз, когда пользователь создает новую компанию, для этой компании создается новая схема. Таким образом, общее количество схем не ограничено 4.

Ответ №1:

Я подозреваю, что вы видите проблему там, где ее на самом деле не существует.

Все гораздо проще, чем может показаться.

О. Где все эти столы?

Существует множество схем с одинаковыми (или почти одинаковыми) объектами внутри них.

Все таблицы зарегистрированы в hasura.

Hasura не может зарегистрировать разные таблицы с одинаковым именем, поэтому по умолчанию имена будут [имя_схемы]_[имя_таблицы] (за исключением 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{
   }
}
 

[schema] замените appcompany1 , appcompany2 , appcompanyZ и выполните.

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

Об обоих решениях: их трудно назвать элегантными.

Я сам не люблю их обоих 😉

Так что решайте сами, что больше подходит в вашем случае.