es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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?

Tags:  , ,

Answer

  1. Avatar for 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 columnas user_id y user_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:

    type UserSummary {
      user_id: Int!
      user_display_name: String!
      subscription_display_name: String
    }
    

    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.

Comments are closed.