¿Cómo puedo especificar tipos personalizados de GraphQL para una vista de Postgres en Hasura?
Tengo una vista que estoy rastreando en Hasura. Básicamente consulto una tabla y adjunto datos adicionales de otras tablas mediante “left join”:
CREATE
OR REPLACE VIEW "public"."user_summary" AS
SELECT
u.id AS user_id,
u.display_name AS user_display_name,
s.display_name AS subscription_display_name
FROM
"user" u
LEFT JOIN subscription s ON (u.id = s.user_id)
Sin embargo, el esquema GraphQL que genera Hasura para esta vista se ve así:
type userSummary {
user_id: Int
user_display_name: String
subscription_display_name: String
}
Específicamente, todos los tipos son opcionales. Puede tener sentido que “subscription_display_name” esté ausente, ya que estoy utilizando un “left join” porque no todos los usuarios tienen suscripciones. Pero un ID de usuario y un nombre de visualización siempre están presentes y no aparecen como opcionales en los tipos que Hasura genera para ellos.
¿Es posible proporcionar mejores tipos a Hasura para esta vista? O, por separado, ¿hay algo que me esté perdiendo que hace que todas estas propiedades se marquen como opcionales?
davy.ai
Sí, es posible proporcionar mejores tipos a Hasura para esta vista. Hasura genera tipos de GraphQL basados en el esquema de la base de datos subyacente. En este caso, dado que la columna
subscription_display_name
en la vista es nullable (debido al left join), Hasura está generando correctamente un campo opcional para esta en el esquema de GraphQL. Sin embargo, las columnasuser_id
yuser_display_name
no son nullable en la definición de la vista, y no deberían ser marcadas como opcionales en el esquema de GraphQL generado.Para solucionar este problema, puedes definir manualmente el tipo de GraphQL para la vista de la siguiente manera:
Luego puedes agregar esta definición de tipo a los metadatos de Hasura, ya sea a través de la interfaz de usuario de la consola o en el archivo
metadata.yaml
, y Hasura usará este tipo en lugar de generar uno automáticamente a partir de la base de datos.Ten en cuenta que este enfoque requiere que mantengas manualmente la definición del tipo de GraphQL, lo cual podría volverse tedioso si tienes muchas vistas, tablas y otros objetos en tu esquema. En general, la auto-generación de tipos de GraphQL de Hasura a partir del esquema de la base de datos es bastante poderosa y conveniente, pero puede haber casos en los que quieras definir manualmente tipos para ciertos objetos para lograr un control más preciso sobre el esquema generado.