Saul  Alaniz

Saul Alaniz

1647763200

Cómo Construir Su Backend Con Hasura Y PostgreSQL

Hasura es un motor GraphQL de código abierto que genera puntos finales de API REST y GraphQL utilizando su esquema de base de datos. Admite el modelado de datos, consultas en tiempo real, programación de eventos, autorización basada en roles y acciones para ejecutar lógica empresarial personalizada en GraphQL.

PostgreSQL es una popular y poderosa base de datos relacional orientada a objetos y de código abierto que ofrece características de clase empresarial en un nivel similar con Oracle Database y Microsoft SQL Server. PostgreSQL es utilizado por grandes empresas internacionales como Netflix, Instagram, Uber y Spotify, según StackShare .

En este artículo, repasaremos las características principales que proporciona Hasura que lo hacen adecuado para desarrollar y lanzar backends escalables, tanto para aplicaciones web como móviles. También veremos cómo puede aprovechar las características de PostgreSQL para realizar varias tareas analíticas y de cómputo usando solo SQL para entregar los datos correctos a su interfaz sin escribir código personalizado.

Tenga en cuenta que Hasura también es compatible con otras bases de datos, como Microsoft SQL Server, Amazon Aurora y Google BigQuery. Nos centraremos en PostgreSQL, ya que es gratuito y accesible para la mayoría de las empresas y organizaciones. El soporte para MySQL llegará pronto, en caso de que esté interesado.

Si es nuevo en GraphQL, consulte nuestro tutorial para obtener más información. Comencemos por qué PostgreSQL puede ser una opción perfecta para su proyecto.

¿Por qué PostgreSQL?

Las bases de datos relacionales tienen muchas ventajas distintas sobre otros tipos de bases de datos, ya que puede modelar sus datos utilizando esquemas estrictos y relaciones de tablas. La capacidad de realizar JOIN y ejecutar transacciones ACID es un requisito importante para muchas aplicaciones en la mayoría de las industrias. Estas características son esenciales para promover la integridad y la consistencia de los datos comerciales en cualquier momento.

PostgreSQL también tiene ventajas adicionales sobre otras bases de datos relacionales como MySQL, ya que:

  • puede modelar datos usando la herencia de tablas
  • tiene un mejor control de concurrencia para entornos multiusuario (puede escribir cantidades masivas de datos de manera más eficiente)
  • es tolerante a fallas y es menos propenso a la corrupción de datos
  • Admite varios tipos de datos únicos, como JSON y Spatial , lo que es útil para aplicaciones relacionadas con las finanzas y la investigación.

PostgreSQL no es solo un servicio de almacenamiento de datos. También es un servidor capaz de ejecutar funciones personalizadas y disparadores para realizar varias tareas analíticas y de cómputo. La ejecución de la lógica en PostgreSQL es más eficiente, ya que elimina la necesidad de escribir un código de servidor personalizado. Puede definir la lógica en PostgreSQL usando:

  • Views , una consulta almacenada que puede ayudar a simplificar consultas complejas
  • Funciones y operadores , como formato de fecha, coincidencia de patrones, operaciones aritméticas
  • Extensiones , complementos que amplían las capacidades de PostgreSQL (como PostGIS )
  • Lenguajes de procedimiento , lenguajes de programación para escribir funciones definidas por el usuario, procedimientos almacenados, activadores y extensión del SQL estándar (como PL/pgSQL )

Cuando implementa la lógica en PostgreSQL, Hasura puede exponerlos a aplicaciones frontend a través de consultas y mutaciones de GraphQL. Aquí hay una vista de nivel superior de un servidor PostgreSQL, como se ve a través de la interfaz pgAdmin :

La interfaz pgAdmin

Aprender a aprovechar las funciones de PostgreSQL puede ayudarlo a resolver problemas complejos fácilmente sin escribir código de servidor. Estos son algunos ejemplos de lo que puede hacer con PostgreSQL:

EJEMPLO 1

Puede recuperar una lista de usuarios en línea que están actualmente activos usando una vista :

CREATE OR REPLACE VIEW "public"."online_users" AS SELECT users.id,    users.last_seen   FROM users  WHERE (users.last_seen >= (now() - '00:00:30'::interval));

EJEMPLO 2

Usando una función de PostGIS , puede enumerar todas las tiendas que se encuentran dentro de un radio de 1,000 metros. Consulte este tutorial de geolocalización para obtener una explicación detallada:

SELECT id, name, address, geomFROM Seattle_StarbucksWHERE ST_DWithin(geom, ST_MakePoint(-122.325959,47.625138)::geography, 1000);

En la siguiente sección, nos centraremos en las características de Hasura.

¿Qué es Hasura?

Hasura es un motor GraphQL de código abierto y en tiempo real que genera puntos finales de API REST y GraphQL para su base de datos. Viene con una consola web que le permite:

  • modela el esquema de tu base de datos
  • ver, insertar, actualizar y eliminar datos
  • implementar políticas de control de acceso basadas en roles
  • ejecutar consultas y mutaciones de GraphQL
  • crear puntos finales REST
  • ejecutar código SQL
  • definir acciones y disparadores

Tablero de la API de Hasura

Hasura no admite la autenticación de usuarios, por lo que deberá integrar Hasura y su aplicación frontend con un proveedor como:

Tampoco hay un servicio de almacenamiento de archivos, deberá integrar su aplicación con un proveedor de almacenamiento de terceros . Si prefiere una experiencia integrada más lista para usar con Hasura, puede consultar NHost , que analizaremos más adelante en la sección de implementación.

En la siguiente sección, veremos cómo podemos ejecutar Hasura localmente y en la nube.

Lanzamiento de Hasura

Hay un par de formas de iniciar y ejecutar rápidamente una instancia de Hasura:

1. ventana acoplable

Usar Docker para ejecutar Hasura en su máquina local es la forma recomendada de configurar un entorno de desarrollo. Con esta configuración, no hay límite de velocidad para las solicitudes de API y no hay conexión a Internet que acelere su experiencia cuando interactúa con la consola web de Hasura. Cualquier trabajo que realice localmente se puede migrar fácilmente a entornos de ensayo y producción. Discutiremos cómo se hace esto más adelante en la sección "Migraciones y entornos".

Suponiendo que ya tiene Docker y Docker Compose instalados en su máquina, puede seguir las instrucciones proporcionadas por esta guía para ejecutar Hasura en su máquina:

# create new directory
mkdir my-hasura
cd my-hasura

# download docker-compose.yml
curl https://raw.githubusercontent.com/hasura/graphql-engine/stable/install-manifests/docker-compose/docker-compose.yaml -o docker-compose.yml

# start hasura and postgresql container instances
docker-compose up -d

Puede confirmar que sus instancias de contenedor de Hasura y PostgreSQL se están ejecutando ejecutando el comando docker ps. Debería poder acceder a su instancia local de Hasura a través de su navegador en http://localhost:8080/console. Para completar la configuración, deberá conectarse a la base de datos PostgreSQL, que se ejecuta como un contenedor junto con Hasura.

Con la base de datos conectada, podrá usar la consola web para crear tablas, definir relaciones y realizar operaciones CRUD en sus datos. Tenga en cuenta que sus datos son públicos cuando utiliza la configuración predeterminada de Docker. Puede asegurarlo simplemente descomentando la línea que comienza HASURA_GRAPHQL_ADMIN_SECRETen su docker-compose.ymlarchivo y reiniciando su contenedor Hasura.

2. Nube

Una forma mucho más fácil de comenzar es a través de Hasura Cloud . Esta es una versión rediseñada de Hasura de código abierto diseñada para escalabilidad, disponibilidad, seguridad
y distribución global.

El panel de Hasura Cloud

Hasura Cloud viene con varias características nuevas que no están disponibles en la versión de código abierto, que incluyen:

Para comenzar con Hasura Cloud, deberá registrarse para obtener una cuenta gratuita. Tenga en cuenta que la cuenta gratuita tiene un límite de velocidad de 60 solicitudes por minuto. Después de crear una cuenta, deberá:

  • Crear un proyecto (una instancia de Hasura)
  • Conectarse a una base de datos PostgreSQL

Para mayor comodidad, Hasura Cloud proporciona una instalación y conexión con un solo clic a una instancia de base de datos gratuita de Heroku Cloud. También puede conectarse a cualquier otra base de datos de PostgreSQL a la que se pueda acceder a través de Internet. Hay muchos proveedores de PostgreSQL que puede usar. Estos incluyen servicios en la nube como:

  • AWS
  • Azur
  • océano digital
  • Nube de DB de escala de tiempo
  • Yugabyte DB

Puede seguir esta guía si necesita más claridad con los pasos anteriores. De forma predeterminada, Hasura Cloud restringe el acceso público a los datos mediante la clave secreta de administrador. Discutiremos más sobre esto en las próximas secciones.

Características de Hasura

En esta sección, le daré una descripción general de alto nivel de las funciones que ofrece Hasura para crear un backend personalizado sin escribir código.

Administrador de datos

Hasura viene con un diseñador visual para modelar su capa de datos. Esto le permite:

  • crear tablas
  • definir relaciones (uno a uno, uno a muchos, muchos a muchos)
  • realizar operaciones CRUD
  • crear vistas
  • ejecutar cualquier instrucción SQL
  • implementar la validación de datos utilizando las restricciones DDL de PostgreSQL
  • definir disparadores

Hasura crear mesa

Cuando se trata de columnas, Hasura admite un amplio conjunto de tipos de datos que incluyen:

  • enteros, numéricos y flotantes
  • seriales y UUID
  • caracteres y texto
  • fecha y hora
  • booleano
  • geométrico: como línea, cuadro, ruta, polígono y círculo
  • JSON

También puede agregar tipos personalizados mediante el CREATE TYPEcomando SQL. A continuación, veremos cómo se autorizan los datos en Hasura.

Autorización

El control de acceso en Hasura se basa en funciones. De forma predeterminada, hay un rol llamado adminque tiene acceso CRUD completo a sus datos. Para restringir el acceso a otros usuarios, deberá crear funciones adicionales, como user, publico accountant.

Para cada rol que cree, debe definir una política de acceso para las siguientes acciones:

  • insertar
  • Seleccione
  • actualizar
  • Eliminar

Hay tres tipos de políticas que puede definir:

  • Acceso completo , sin restricciones
  • Acceso parcial , con restricciones basadas en condiciones
  • Sin acceso

El siguiente ejemplo muestra una selectpolítica de autorización para el userrol. Las reglas definidas a continuación se establecen para garantizar que un usersolo pueda consultar sus propios registros o los marcados como públicos:

Ejemplo de autorización de Hasura

Consultas

Después de diseñar su esquema y definir los permisos, puede probar sus consultas de GraphQL directamente en el panel de API de Hasura. Se pueden consultar todas las tablas, vistas y relaciones que haya definido, siempre que se haya habilitado el seguimiento.

Los tipos de consultas que puede ejecutar incluyen:

  • Consultas simples : consultas SELECT que devuelven uno o más objetos.
  • Consultas anidadas : consultas JOIN que devuelven objetos en un formato anidado basado en relaciones de clave externa.
  • Consultas de agregación : consultas SELECT en las que se ha realizado una operación aritmética como suma o promedio en los resultados. También se puede aplicar a objetos anidados.
  • Consultas de filtro/búsqueda : consultas WHERE que filtran datos utilizando operadores de comparación en uno o más campos. También se pueden utilizar para realizar búsquedas mediante coincidencias aproximadas o de patrones.

Hasura GraphQL query

Los resultados de las consultas de GraphQL se pueden ordenar , agrupar y paginar . También se admite la paginación basada en cursores . Básicamente, cualquier instrucción SQL que se pueda ejecutar en PostgreSQL se puede exponer a través de una consulta GraphQL. En la siguiente sección, veremos las mutaciones.

Mutaciones

Las mutaciones de GraphQL son declaraciones que se utilizan para modificar datos. A continuación se muestran los tipos de mutaciones que puede realizar:

  • Insertar : crea una o más filas de datos:
  mutation insert_single_article {
    insert_article_one(
      object: {
        title: "Article 1"
        content: "Sample article content"
        author_id: 3
      }
    ) {
      id
      title
    }
  }
  • Upsert : crear, actualizar en conflicto. En el siguiente ejemplo, la columna valuetiene una restricción única :
  mutation upsert_single_tag {
    insert_tags(
      objects: { value: "Java" }
      on_conflict: { constraint: tags_value_key, update_columns: value }
    ) {
      returning {
        id
        value
      }
    }
  }
  • Actualizar : actualiza una o más filas de datos. También hay operadores especiales para trabajar con inty jsonbtipos de datos. El siguiente ejemplo actualiza todos los artículos con una calificación menor o igual a 2. La mutación devolverá el número de filas afectadas y también enumerará esas filas como una matriz de objetos:
  mutation update_article {
    update_article(
      where: { rating: { _lte: 2 } }
      _set: { rating: 1, is_published: false }
    ) {
      affected_rows
      returning {
        id
        title
        content
        rating
        is_published
      }
    }
  }
  • Eliminar : eliminar una o más filas de datos. El siguiente ejemplo elimina un artículo por clave principal:
  mutation delete_an_object {
    delete_article_by_pk(id: 1) {
      id
      title
      user_id
    }
  }
  • Transacción : realizar múltiples mutaciones en un bloque de mutación. Si uno de ellos falla, todas las mutaciones ejecutadas previamente dentro de ese bloque se revertirán. El siguiente ejemplo primero elimina todos los artículos que pertenecen a un autor. En la segunda mutación, se actualiza el nombre del autor:
  mutation reset_author {
    delete_article(where: { author_id: { _eq: 6 } }) {
      affected_rows
    }
    update_author(where: { id: { _eq: 6 } }, _set: { name: "Cory" }) {
      returning {
        id
        name
        articles {
          id
          title
        }
      }
    }
  }

Suscripciones

Las suscripciones de Hasura son consultas en vivo que se ejecutan sobre un protocolo WebSocket . Este es un protocolo utilizado para obtener datos en tiempo real de una base de datos. Cualquier consulta de GraphQL se puede convertir en una suscripción simplemente reemplazando la palabra clave querycon subscription. De forma predeterminada, estas consultas ejecutan una instrucción SQL cada segundo. Esta es una configuración configurable que se puede ajustar para proporcionar un equilibrio adecuado entre la carga de la base de datos y la latencia. Si hay un cambio en los datos subyacentes, el nuevo valor se envía al cliente.

El siguiente ejemplo muestra una suscripción de GraphQL que rastrea la ubicación de un vehículo:

# $vehicleId = 3subscription getLocation($vehicleId: Int!) {  vehicle(where: { id: { _eq: $vehicleId } }) {    id    vehicle_number    locations(order_by: { timestamp: desc }, limit: 1) {      location      timestamp    }  }}

Otros casos de uso de suscripciones incluyen:

  • seguimiento de entrega de alimentos
  • mensajes de chat
  • encuestas en línea

Esquemas remotos

A menudo, al crear una aplicación moderna, deberá integrarse con API de terceros que:

  • proporcionar datos que no están en su base de datos, como resultados deportivos en vivo o precio de las acciones
  • proporcionar lógica comercial, como procesamiento de pagos o reserva de vuelos

Por lo general, se accede a estas API de terceros directamente desde las aplicaciones de los clientes. Con Hasura, puede fusionar estas API con su base de datos para crear una API GraphQL unificada. Esto crea nuevas oportunidades en las que puede implementar la autorización y definir relaciones remotas entre sus tablas/vistas y la API remota. También puede crear Acciones que realicen una determinada tarea en función de este tipo de relación.

Tener una API GraphQL unificada facilita a los desarrolladores frontend la creación de la aplicación. En la siguiente sección, veremos qué son las acciones de Hasura.

Comportamiento

La lógica comercial personalizada en Hasura se maneja externamente en microservicios o funciones sin servidor a través de webhooks. Esto significa que puede escribir una lógica personalizada con el lenguaje que prefiera, como Node.js, Python, Go o Ruby on Rails. Una acción en Hasura es simplemente una consulta o mutación GraphQL personalizada que se asigna a un webhook donde se definen las interfaces de entrada y salida.

Una definición de acción se compone de:

  • tipo: consulta o mutación
  • nombre de la acción
  • tipos personalizados para entradas y salidas
  • encabezados
  • URL del controlador

Veamos un simple "¡Hola, mundo!" ejemplo. Primero, definimos una consulta de acción de la siguiente manera:

type Query {  hello(name: String!): HelloResponse}

La acción anterior define una función llamada helloque acepta una variable de cadena llamada namecomo entrada. La función devuelve un HelloResponseobjeto, que es un tipo personalizado que se define de la siguiente manera:

type HelloResponse {  message: String!}

Con la interfaz definida, todo lo que queda es implementar el servicio de webhook y una URL a la que puede acceder su instancia de Hasura. Aquí hay una implementación escrita para Express.js que se creó con la ayuda del asistente CodeGen de Hasura:

// Request Handlerapp.post("/hello", async (req, res) => {  // get request input  const { name } = req.body.input;  // success  return res.json({    message: `Hello, ${name}!`,  });});

Activadores de eventos

En Hasura, puede crear aplicaciones utilizando una arquitectura de software conocida como programación basada en eventos . Este es un patrón de diseño que desacopla la gestión de estado compleja de un backend monolítico y la transfiere a microservicios individuales o funciones sin servidor que ejecutan la lógica empresarial. Esto permite la creación de aplicaciones que son altamente robustas y escalables.

Con la programación de eventos, puede manejar fácilmente muchos casos de uso, como:

En PostgreSQL, puede crear activadores que ejecuten instrucciones SQL o procedimientos almacenados cuando ocurra un evento como INSERT, UPDATEo . DELETEUn activador está asociado a una tabla o vista y puede activarse antes o después de un evento.

En Hasura, los activadores de eventos se definen de manera similar y se utilizan para invocar enlaces web cuando se activa un evento. Un web hook en este contexto es bastante similar a los que acabamos de discutir en la sección "Acciones". Los disparadores de eventos también se pueden invocar manualmente a través de la consola o la API.

A continuación se muestra un ejemplo de una definición de activación de evento en formato YAML:

- table:    schema: public    name: author  event_triggers:    - name: author_trigger      definition:        enable_manual: false        insert:          columns: "*"        update:          columns: "*"      webhook: https://httpbin.org/post

Un disparador de eventos se puede definir con encabezados (para fines de autenticación) y, por lo general, contiene una carga útil que se envía al servicio de webhook para el procesamiento de datos. La única respuesta esperada es el 200estado. Los resultados reales, si es necesario, se publican a través de una ruta diferente, como publicar una mutación de GraphQL o enviar una notificación por correo electrónico, etc.

Las aplicaciones frontend pueden recibir los resultados consultando a través de la suscripción a GraphQL. Este tipo de arquitectura facilita la creación de aplicaciones interactivas en tiempo real sin bloqueo que ofrecen una excelente experiencia de usuario. El código base también es más fácil de mantener, probar y escalar para los desarrolladores.

Desencadenadores programados

Los disparadores programados son eventos basados ​​en el tiempo que ejecutan una lógica comercial personalizada a través de webhooks. Hay dos tipos que puede definir:

  • Desencadenadores CRON : utilizados para eventos periódicos a intervalos regulares
  • Eventos programados únicos : utilizados para ejecuciones únicas

Los activadores programados se pueden crear a través de la consola web o a través de la API de metadatos. La siguiente captura de pantalla muestra el ejemplo de la consola web.

Disparador cron de la consola web

La API de metadatos permite la creación de eventos programados utilizando el código de la aplicación. El siguiente ejemplo muestra cómo estructuraría la creación de un evento único utilizando la API:

{  "type": "create_scheduled_event",  "args": {    "webhook": "https://my-awesome-serverless-fn.com/send-email",    "schedule_at": "2022-07-20T12:45:00Z",    "payload": {      "email": "bob@ross.com"    }  }}

Hasura proporciona una serie de mecanismos de tolerancia a fallas que garantizan que los activadores programados se ejecuten correctamente. Por ejemplo, supongamos que un evento que estaba programado para las 2:00 p. m. no se procesó porque Hasura estaba fuera de servicio a la 1:59 p. m. Cuando Hasura vuelva a estar en línea, rehidratará los eventos y volverá a ejecutar los desencadenantes programados perdidos en función de una configuración de tolerancia personalizable. La configuración predeterminada es de seis horas.

Hasura también proporciona una configuración de reintento flexible en caso de fallas de HTTP. Puede configurar el número de reintentos y el tiempo de espera entre cada reintento. Cada invocación de activación se registra, a la que puede acceder más tarde para su inspección.

Los casos de uso para activadores programados incluyen:

  • enviar recordatorios
  • generación de informes al final del día
  • eliminar usuarios inactivos que no han verificado su dirección de correo electrónico en los últimos 90 días

Migraciones y Entornos

El flujo de trabajo de desarrollo ideal para cualquier proyecto de software es configurar varios entornos para el desarrollo, la puesta en escena y la producción. Este flujo de trabajo simplifica las pruebas y garantiza que los desarrolladores no eliminen o corrompan accidentalmente los datos de producción al implementar nuevas versiones de su software.

Para transferir el estado de un entorno de desarrollo a ensayo y producción, se requieren archivos de migración . Con Hasura, necesitarás:

  • base de datos/archivos de migración SQL
  • metadatos de hasura

Los metadatos de Hasura se componen de una instantánea de los archivos de configuración que realiza un seguimiento de:

  • relaciones
  • permisos
  • disparadores
  • comportamiento
  • esquema GraphQL
  • esquema remoto

Deberá instalar Hasura CLI para poder crear y aplicar estos archivos de migración a una instancia diferente de Hasura. Estos archivos de migración se pueden versionar y actualizar de forma incremental a medida que cambia el esquema durante el desarrollo.

La creación y aplicación de archivos de migración de SQL se realiza con el hasura migratecomando, mientras que los archivos de migración de metadatos se manejan con hasura metadatael comando. El comando CLI también le permite:

  • revertir las migraciones aplicadas
  • crear migración de datos semilla
  • restablecer archivos de migración
  • aplaste los archivos de migración, es decir, reemplace las pequeñas actualizaciones incrementales con una actualización importante

Hasura tiene una imagen de migración climática especial de Docker que aplica automáticamente las migraciones cuando se inicia el servidor. Esta imagen también contiene la herramienta Hasura CLI , que se puede usar para ejecutar scripts de CI/CD en su flujo de trabajo.

Despliegue

La forma más fácil de implementar Hasura para producción es usando Hasura Cloud . Esta es la opción recomendada, ya que obtiene funciones empresariales que no están disponibles en la versión de código abierto. Afortunadamente, Hasura no lo encierra en su plataforma, a diferencia de la mayoría de los proveedores de back-end como servicio (BaaS). Hay proveedores de servicios de implementación con un solo clic que puede aprovechar en plataformas como:

También puede implementar Hasura en cualquier plataforma de Kubernetes , como Google Cloud . AWS también es compatible, pero debe realizar una serie de pasos para que funcione. El alojamiento externo le brinda libertad y más opciones de precios. Sin embargo, todas las opciones anteriores requieren que configure servicios adicionales para:

  • autenticación
  • almacenamiento
  • lógica empresarial personalizada

En la siguiente sección, veremos brevemente cómo puede usar NHost para simplificar aún más el desarrollo de aplicaciones back-end de Hasura.

Implementación con NHost

NHost es un proveedor de BaaS de código abierto que pretende competir con plataformas como Firebase . Su backend stack consiste en:

  • Base de datos PostgreSQL
  • Motor Hasura GraphQL
  • un servicio de autenticación
  • MinIO , un servicio de almacenamiento de objetos compatible con S3
  • Funciones sin servidor (actualmente en beta)

La plataforma viene con una biblioteca de cliente llamada nhost-js-sdkque se utiliza para la autenticación frontend y la gestión de archivos. El servicio de almacenamiento admite la optimización de imágenes , lo que nos ahorra la molestia de integrar otro servicio para imágenes.

En el momento de escribir este artículo, NHost actualmente ofrece una prueba de 14 días para su servicio. Próximamente se lanzará un nivel gratuito. Hay una versión de Docker llamada Hasura Backend Plus que puede implementar localmente en su máquina.

Resumen

Para concluir, Hasura GraphQL Engine y la base de datos PostgreSQL son bastante revolucionarias en términos de la rapidez con la que puede crear backends para aplicaciones móviles y web, sin escribir líneas de código. PostgreSQL puede manejar la mayor parte de la lógica analítica y de cómputo, mientras que el resto de la lógica comercial personalizada se puede implementar mediante microservicios o funciones sin servidor.

Adoptar Hasura significa que podrá realizar un lanzamiento más rápido y crear un producto de alto rendimiento, seguro, tolerante a fallas, escalable y fácil de mantener. No tener problemas de infraestructura también reducirá sus costos operativos y le permitirá concentrarse en el desarrollo frontend y la parte de su aplicación orientada al usuario.

Aunque Hasura no tiene tantas funciones como otras alternativas de código abierto como la plataforma Parse , es compatible con el control de versiones y la puesta en escena del entorno, que es un requisito crucial para los flujos de trabajo de desarrollo de CI/CD. Debido a que es de código abierto, está protegido de los riesgos que plantean los bloqueos de proveedores.

Fuente: https://www.sitepoint.com/hasura-postgresql-build-backend/

#postgresql  #hasura 

What is GEEK

Buddha Community

Cómo Construir Su Backend Con Hasura Y PostgreSQL
Saul  Alaniz

Saul Alaniz

1647763200

Cómo Construir Su Backend Con Hasura Y PostgreSQL

Hasura es un motor GraphQL de código abierto que genera puntos finales de API REST y GraphQL utilizando su esquema de base de datos. Admite el modelado de datos, consultas en tiempo real, programación de eventos, autorización basada en roles y acciones para ejecutar lógica empresarial personalizada en GraphQL.

PostgreSQL es una popular y poderosa base de datos relacional orientada a objetos y de código abierto que ofrece características de clase empresarial en un nivel similar con Oracle Database y Microsoft SQL Server. PostgreSQL es utilizado por grandes empresas internacionales como Netflix, Instagram, Uber y Spotify, según StackShare .

En este artículo, repasaremos las características principales que proporciona Hasura que lo hacen adecuado para desarrollar y lanzar backends escalables, tanto para aplicaciones web como móviles. También veremos cómo puede aprovechar las características de PostgreSQL para realizar varias tareas analíticas y de cómputo usando solo SQL para entregar los datos correctos a su interfaz sin escribir código personalizado.

Tenga en cuenta que Hasura también es compatible con otras bases de datos, como Microsoft SQL Server, Amazon Aurora y Google BigQuery. Nos centraremos en PostgreSQL, ya que es gratuito y accesible para la mayoría de las empresas y organizaciones. El soporte para MySQL llegará pronto, en caso de que esté interesado.

Si es nuevo en GraphQL, consulte nuestro tutorial para obtener más información. Comencemos por qué PostgreSQL puede ser una opción perfecta para su proyecto.

¿Por qué PostgreSQL?

Las bases de datos relacionales tienen muchas ventajas distintas sobre otros tipos de bases de datos, ya que puede modelar sus datos utilizando esquemas estrictos y relaciones de tablas. La capacidad de realizar JOIN y ejecutar transacciones ACID es un requisito importante para muchas aplicaciones en la mayoría de las industrias. Estas características son esenciales para promover la integridad y la consistencia de los datos comerciales en cualquier momento.

PostgreSQL también tiene ventajas adicionales sobre otras bases de datos relacionales como MySQL, ya que:

  • puede modelar datos usando la herencia de tablas
  • tiene un mejor control de concurrencia para entornos multiusuario (puede escribir cantidades masivas de datos de manera más eficiente)
  • es tolerante a fallas y es menos propenso a la corrupción de datos
  • Admite varios tipos de datos únicos, como JSON y Spatial , lo que es útil para aplicaciones relacionadas con las finanzas y la investigación.

PostgreSQL no es solo un servicio de almacenamiento de datos. También es un servidor capaz de ejecutar funciones personalizadas y disparadores para realizar varias tareas analíticas y de cómputo. La ejecución de la lógica en PostgreSQL es más eficiente, ya que elimina la necesidad de escribir un código de servidor personalizado. Puede definir la lógica en PostgreSQL usando:

  • Views , una consulta almacenada que puede ayudar a simplificar consultas complejas
  • Funciones y operadores , como formato de fecha, coincidencia de patrones, operaciones aritméticas
  • Extensiones , complementos que amplían las capacidades de PostgreSQL (como PostGIS )
  • Lenguajes de procedimiento , lenguajes de programación para escribir funciones definidas por el usuario, procedimientos almacenados, activadores y extensión del SQL estándar (como PL/pgSQL )

Cuando implementa la lógica en PostgreSQL, Hasura puede exponerlos a aplicaciones frontend a través de consultas y mutaciones de GraphQL. Aquí hay una vista de nivel superior de un servidor PostgreSQL, como se ve a través de la interfaz pgAdmin :

La interfaz pgAdmin

Aprender a aprovechar las funciones de PostgreSQL puede ayudarlo a resolver problemas complejos fácilmente sin escribir código de servidor. Estos son algunos ejemplos de lo que puede hacer con PostgreSQL:

EJEMPLO 1

Puede recuperar una lista de usuarios en línea que están actualmente activos usando una vista :

CREATE OR REPLACE VIEW "public"."online_users" AS SELECT users.id,    users.last_seen   FROM users  WHERE (users.last_seen >= (now() - '00:00:30'::interval));

EJEMPLO 2

Usando una función de PostGIS , puede enumerar todas las tiendas que se encuentran dentro de un radio de 1,000 metros. Consulte este tutorial de geolocalización para obtener una explicación detallada:

SELECT id, name, address, geomFROM Seattle_StarbucksWHERE ST_DWithin(geom, ST_MakePoint(-122.325959,47.625138)::geography, 1000);

En la siguiente sección, nos centraremos en las características de Hasura.

¿Qué es Hasura?

Hasura es un motor GraphQL de código abierto y en tiempo real que genera puntos finales de API REST y GraphQL para su base de datos. Viene con una consola web que le permite:

  • modela el esquema de tu base de datos
  • ver, insertar, actualizar y eliminar datos
  • implementar políticas de control de acceso basadas en roles
  • ejecutar consultas y mutaciones de GraphQL
  • crear puntos finales REST
  • ejecutar código SQL
  • definir acciones y disparadores

Tablero de la API de Hasura

Hasura no admite la autenticación de usuarios, por lo que deberá integrar Hasura y su aplicación frontend con un proveedor como:

Tampoco hay un servicio de almacenamiento de archivos, deberá integrar su aplicación con un proveedor de almacenamiento de terceros . Si prefiere una experiencia integrada más lista para usar con Hasura, puede consultar NHost , que analizaremos más adelante en la sección de implementación.

En la siguiente sección, veremos cómo podemos ejecutar Hasura localmente y en la nube.

Lanzamiento de Hasura

Hay un par de formas de iniciar y ejecutar rápidamente una instancia de Hasura:

1. ventana acoplable

Usar Docker para ejecutar Hasura en su máquina local es la forma recomendada de configurar un entorno de desarrollo. Con esta configuración, no hay límite de velocidad para las solicitudes de API y no hay conexión a Internet que acelere su experiencia cuando interactúa con la consola web de Hasura. Cualquier trabajo que realice localmente se puede migrar fácilmente a entornos de ensayo y producción. Discutiremos cómo se hace esto más adelante en la sección "Migraciones y entornos".

Suponiendo que ya tiene Docker y Docker Compose instalados en su máquina, puede seguir las instrucciones proporcionadas por esta guía para ejecutar Hasura en su máquina:

# create new directory
mkdir my-hasura
cd my-hasura

# download docker-compose.yml
curl https://raw.githubusercontent.com/hasura/graphql-engine/stable/install-manifests/docker-compose/docker-compose.yaml -o docker-compose.yml

# start hasura and postgresql container instances
docker-compose up -d

Puede confirmar que sus instancias de contenedor de Hasura y PostgreSQL se están ejecutando ejecutando el comando docker ps. Debería poder acceder a su instancia local de Hasura a través de su navegador en http://localhost:8080/console. Para completar la configuración, deberá conectarse a la base de datos PostgreSQL, que se ejecuta como un contenedor junto con Hasura.

Con la base de datos conectada, podrá usar la consola web para crear tablas, definir relaciones y realizar operaciones CRUD en sus datos. Tenga en cuenta que sus datos son públicos cuando utiliza la configuración predeterminada de Docker. Puede asegurarlo simplemente descomentando la línea que comienza HASURA_GRAPHQL_ADMIN_SECRETen su docker-compose.ymlarchivo y reiniciando su contenedor Hasura.

2. Nube

Una forma mucho más fácil de comenzar es a través de Hasura Cloud . Esta es una versión rediseñada de Hasura de código abierto diseñada para escalabilidad, disponibilidad, seguridad
y distribución global.

El panel de Hasura Cloud

Hasura Cloud viene con varias características nuevas que no están disponibles en la versión de código abierto, que incluyen:

Para comenzar con Hasura Cloud, deberá registrarse para obtener una cuenta gratuita. Tenga en cuenta que la cuenta gratuita tiene un límite de velocidad de 60 solicitudes por minuto. Después de crear una cuenta, deberá:

  • Crear un proyecto (una instancia de Hasura)
  • Conectarse a una base de datos PostgreSQL

Para mayor comodidad, Hasura Cloud proporciona una instalación y conexión con un solo clic a una instancia de base de datos gratuita de Heroku Cloud. También puede conectarse a cualquier otra base de datos de PostgreSQL a la que se pueda acceder a través de Internet. Hay muchos proveedores de PostgreSQL que puede usar. Estos incluyen servicios en la nube como:

  • AWS
  • Azur
  • océano digital
  • Nube de DB de escala de tiempo
  • Yugabyte DB

Puede seguir esta guía si necesita más claridad con los pasos anteriores. De forma predeterminada, Hasura Cloud restringe el acceso público a los datos mediante la clave secreta de administrador. Discutiremos más sobre esto en las próximas secciones.

Características de Hasura

En esta sección, le daré una descripción general de alto nivel de las funciones que ofrece Hasura para crear un backend personalizado sin escribir código.

Administrador de datos

Hasura viene con un diseñador visual para modelar su capa de datos. Esto le permite:

  • crear tablas
  • definir relaciones (uno a uno, uno a muchos, muchos a muchos)
  • realizar operaciones CRUD
  • crear vistas
  • ejecutar cualquier instrucción SQL
  • implementar la validación de datos utilizando las restricciones DDL de PostgreSQL
  • definir disparadores

Hasura crear mesa

Cuando se trata de columnas, Hasura admite un amplio conjunto de tipos de datos que incluyen:

  • enteros, numéricos y flotantes
  • seriales y UUID
  • caracteres y texto
  • fecha y hora
  • booleano
  • geométrico: como línea, cuadro, ruta, polígono y círculo
  • JSON

También puede agregar tipos personalizados mediante el CREATE TYPEcomando SQL. A continuación, veremos cómo se autorizan los datos en Hasura.

Autorización

El control de acceso en Hasura se basa en funciones. De forma predeterminada, hay un rol llamado adminque tiene acceso CRUD completo a sus datos. Para restringir el acceso a otros usuarios, deberá crear funciones adicionales, como user, publico accountant.

Para cada rol que cree, debe definir una política de acceso para las siguientes acciones:

  • insertar
  • Seleccione
  • actualizar
  • Eliminar

Hay tres tipos de políticas que puede definir:

  • Acceso completo , sin restricciones
  • Acceso parcial , con restricciones basadas en condiciones
  • Sin acceso

El siguiente ejemplo muestra una selectpolítica de autorización para el userrol. Las reglas definidas a continuación se establecen para garantizar que un usersolo pueda consultar sus propios registros o los marcados como públicos:

Ejemplo de autorización de Hasura

Consultas

Después de diseñar su esquema y definir los permisos, puede probar sus consultas de GraphQL directamente en el panel de API de Hasura. Se pueden consultar todas las tablas, vistas y relaciones que haya definido, siempre que se haya habilitado el seguimiento.

Los tipos de consultas que puede ejecutar incluyen:

  • Consultas simples : consultas SELECT que devuelven uno o más objetos.
  • Consultas anidadas : consultas JOIN que devuelven objetos en un formato anidado basado en relaciones de clave externa.
  • Consultas de agregación : consultas SELECT en las que se ha realizado una operación aritmética como suma o promedio en los resultados. También se puede aplicar a objetos anidados.
  • Consultas de filtro/búsqueda : consultas WHERE que filtran datos utilizando operadores de comparación en uno o más campos. También se pueden utilizar para realizar búsquedas mediante coincidencias aproximadas o de patrones.

Hasura GraphQL query

Los resultados de las consultas de GraphQL se pueden ordenar , agrupar y paginar . También se admite la paginación basada en cursores . Básicamente, cualquier instrucción SQL que se pueda ejecutar en PostgreSQL se puede exponer a través de una consulta GraphQL. En la siguiente sección, veremos las mutaciones.

Mutaciones

Las mutaciones de GraphQL son declaraciones que se utilizan para modificar datos. A continuación se muestran los tipos de mutaciones que puede realizar:

  • Insertar : crea una o más filas de datos:
  mutation insert_single_article {
    insert_article_one(
      object: {
        title: "Article 1"
        content: "Sample article content"
        author_id: 3
      }
    ) {
      id
      title
    }
  }
  • Upsert : crear, actualizar en conflicto. En el siguiente ejemplo, la columna valuetiene una restricción única :
  mutation upsert_single_tag {
    insert_tags(
      objects: { value: "Java" }
      on_conflict: { constraint: tags_value_key, update_columns: value }
    ) {
      returning {
        id
        value
      }
    }
  }
  • Actualizar : actualiza una o más filas de datos. También hay operadores especiales para trabajar con inty jsonbtipos de datos. El siguiente ejemplo actualiza todos los artículos con una calificación menor o igual a 2. La mutación devolverá el número de filas afectadas y también enumerará esas filas como una matriz de objetos:
  mutation update_article {
    update_article(
      where: { rating: { _lte: 2 } }
      _set: { rating: 1, is_published: false }
    ) {
      affected_rows
      returning {
        id
        title
        content
        rating
        is_published
      }
    }
  }
  • Eliminar : eliminar una o más filas de datos. El siguiente ejemplo elimina un artículo por clave principal:
  mutation delete_an_object {
    delete_article_by_pk(id: 1) {
      id
      title
      user_id
    }
  }
  • Transacción : realizar múltiples mutaciones en un bloque de mutación. Si uno de ellos falla, todas las mutaciones ejecutadas previamente dentro de ese bloque se revertirán. El siguiente ejemplo primero elimina todos los artículos que pertenecen a un autor. En la segunda mutación, se actualiza el nombre del autor:
  mutation reset_author {
    delete_article(where: { author_id: { _eq: 6 } }) {
      affected_rows
    }
    update_author(where: { id: { _eq: 6 } }, _set: { name: "Cory" }) {
      returning {
        id
        name
        articles {
          id
          title
        }
      }
    }
  }

Suscripciones

Las suscripciones de Hasura son consultas en vivo que se ejecutan sobre un protocolo WebSocket . Este es un protocolo utilizado para obtener datos en tiempo real de una base de datos. Cualquier consulta de GraphQL se puede convertir en una suscripción simplemente reemplazando la palabra clave querycon subscription. De forma predeterminada, estas consultas ejecutan una instrucción SQL cada segundo. Esta es una configuración configurable que se puede ajustar para proporcionar un equilibrio adecuado entre la carga de la base de datos y la latencia. Si hay un cambio en los datos subyacentes, el nuevo valor se envía al cliente.

El siguiente ejemplo muestra una suscripción de GraphQL que rastrea la ubicación de un vehículo:

# $vehicleId = 3subscription getLocation($vehicleId: Int!) {  vehicle(where: { id: { _eq: $vehicleId } }) {    id    vehicle_number    locations(order_by: { timestamp: desc }, limit: 1) {      location      timestamp    }  }}

Otros casos de uso de suscripciones incluyen:

  • seguimiento de entrega de alimentos
  • mensajes de chat
  • encuestas en línea

Esquemas remotos

A menudo, al crear una aplicación moderna, deberá integrarse con API de terceros que:

  • proporcionar datos que no están en su base de datos, como resultados deportivos en vivo o precio de las acciones
  • proporcionar lógica comercial, como procesamiento de pagos o reserva de vuelos

Por lo general, se accede a estas API de terceros directamente desde las aplicaciones de los clientes. Con Hasura, puede fusionar estas API con su base de datos para crear una API GraphQL unificada. Esto crea nuevas oportunidades en las que puede implementar la autorización y definir relaciones remotas entre sus tablas/vistas y la API remota. También puede crear Acciones que realicen una determinada tarea en función de este tipo de relación.

Tener una API GraphQL unificada facilita a los desarrolladores frontend la creación de la aplicación. En la siguiente sección, veremos qué son las acciones de Hasura.

Comportamiento

La lógica comercial personalizada en Hasura se maneja externamente en microservicios o funciones sin servidor a través de webhooks. Esto significa que puede escribir una lógica personalizada con el lenguaje que prefiera, como Node.js, Python, Go o Ruby on Rails. Una acción en Hasura es simplemente una consulta o mutación GraphQL personalizada que se asigna a un webhook donde se definen las interfaces de entrada y salida.

Una definición de acción se compone de:

  • tipo: consulta o mutación
  • nombre de la acción
  • tipos personalizados para entradas y salidas
  • encabezados
  • URL del controlador

Veamos un simple "¡Hola, mundo!" ejemplo. Primero, definimos una consulta de acción de la siguiente manera:

type Query {  hello(name: String!): HelloResponse}

La acción anterior define una función llamada helloque acepta una variable de cadena llamada namecomo entrada. La función devuelve un HelloResponseobjeto, que es un tipo personalizado que se define de la siguiente manera:

type HelloResponse {  message: String!}

Con la interfaz definida, todo lo que queda es implementar el servicio de webhook y una URL a la que puede acceder su instancia de Hasura. Aquí hay una implementación escrita para Express.js que se creó con la ayuda del asistente CodeGen de Hasura:

// Request Handlerapp.post("/hello", async (req, res) => {  // get request input  const { name } = req.body.input;  // success  return res.json({    message: `Hello, ${name}!`,  });});

Activadores de eventos

En Hasura, puede crear aplicaciones utilizando una arquitectura de software conocida como programación basada en eventos . Este es un patrón de diseño que desacopla la gestión de estado compleja de un backend monolítico y la transfiere a microservicios individuales o funciones sin servidor que ejecutan la lógica empresarial. Esto permite la creación de aplicaciones que son altamente robustas y escalables.

Con la programación de eventos, puede manejar fácilmente muchos casos de uso, como:

En PostgreSQL, puede crear activadores que ejecuten instrucciones SQL o procedimientos almacenados cuando ocurra un evento como INSERT, UPDATEo . DELETEUn activador está asociado a una tabla o vista y puede activarse antes o después de un evento.

En Hasura, los activadores de eventos se definen de manera similar y se utilizan para invocar enlaces web cuando se activa un evento. Un web hook en este contexto es bastante similar a los que acabamos de discutir en la sección "Acciones". Los disparadores de eventos también se pueden invocar manualmente a través de la consola o la API.

A continuación se muestra un ejemplo de una definición de activación de evento en formato YAML:

- table:    schema: public    name: author  event_triggers:    - name: author_trigger      definition:        enable_manual: false        insert:          columns: "*"        update:          columns: "*"      webhook: https://httpbin.org/post

Un disparador de eventos se puede definir con encabezados (para fines de autenticación) y, por lo general, contiene una carga útil que se envía al servicio de webhook para el procesamiento de datos. La única respuesta esperada es el 200estado. Los resultados reales, si es necesario, se publican a través de una ruta diferente, como publicar una mutación de GraphQL o enviar una notificación por correo electrónico, etc.

Las aplicaciones frontend pueden recibir los resultados consultando a través de la suscripción a GraphQL. Este tipo de arquitectura facilita la creación de aplicaciones interactivas en tiempo real sin bloqueo que ofrecen una excelente experiencia de usuario. El código base también es más fácil de mantener, probar y escalar para los desarrolladores.

Desencadenadores programados

Los disparadores programados son eventos basados ​​en el tiempo que ejecutan una lógica comercial personalizada a través de webhooks. Hay dos tipos que puede definir:

  • Desencadenadores CRON : utilizados para eventos periódicos a intervalos regulares
  • Eventos programados únicos : utilizados para ejecuciones únicas

Los activadores programados se pueden crear a través de la consola web o a través de la API de metadatos. La siguiente captura de pantalla muestra el ejemplo de la consola web.

Disparador cron de la consola web

La API de metadatos permite la creación de eventos programados utilizando el código de la aplicación. El siguiente ejemplo muestra cómo estructuraría la creación de un evento único utilizando la API:

{  "type": "create_scheduled_event",  "args": {    "webhook": "https://my-awesome-serverless-fn.com/send-email",    "schedule_at": "2022-07-20T12:45:00Z",    "payload": {      "email": "bob@ross.com"    }  }}

Hasura proporciona una serie de mecanismos de tolerancia a fallas que garantizan que los activadores programados se ejecuten correctamente. Por ejemplo, supongamos que un evento que estaba programado para las 2:00 p. m. no se procesó porque Hasura estaba fuera de servicio a la 1:59 p. m. Cuando Hasura vuelva a estar en línea, rehidratará los eventos y volverá a ejecutar los desencadenantes programados perdidos en función de una configuración de tolerancia personalizable. La configuración predeterminada es de seis horas.

Hasura también proporciona una configuración de reintento flexible en caso de fallas de HTTP. Puede configurar el número de reintentos y el tiempo de espera entre cada reintento. Cada invocación de activación se registra, a la que puede acceder más tarde para su inspección.

Los casos de uso para activadores programados incluyen:

  • enviar recordatorios
  • generación de informes al final del día
  • eliminar usuarios inactivos que no han verificado su dirección de correo electrónico en los últimos 90 días

Migraciones y Entornos

El flujo de trabajo de desarrollo ideal para cualquier proyecto de software es configurar varios entornos para el desarrollo, la puesta en escena y la producción. Este flujo de trabajo simplifica las pruebas y garantiza que los desarrolladores no eliminen o corrompan accidentalmente los datos de producción al implementar nuevas versiones de su software.

Para transferir el estado de un entorno de desarrollo a ensayo y producción, se requieren archivos de migración . Con Hasura, necesitarás:

  • base de datos/archivos de migración SQL
  • metadatos de hasura

Los metadatos de Hasura se componen de una instantánea de los archivos de configuración que realiza un seguimiento de:

  • relaciones
  • permisos
  • disparadores
  • comportamiento
  • esquema GraphQL
  • esquema remoto

Deberá instalar Hasura CLI para poder crear y aplicar estos archivos de migración a una instancia diferente de Hasura. Estos archivos de migración se pueden versionar y actualizar de forma incremental a medida que cambia el esquema durante el desarrollo.

La creación y aplicación de archivos de migración de SQL se realiza con el hasura migratecomando, mientras que los archivos de migración de metadatos se manejan con hasura metadatael comando. El comando CLI también le permite:

  • revertir las migraciones aplicadas
  • crear migración de datos semilla
  • restablecer archivos de migración
  • aplaste los archivos de migración, es decir, reemplace las pequeñas actualizaciones incrementales con una actualización importante

Hasura tiene una imagen de migración climática especial de Docker que aplica automáticamente las migraciones cuando se inicia el servidor. Esta imagen también contiene la herramienta Hasura CLI , que se puede usar para ejecutar scripts de CI/CD en su flujo de trabajo.

Despliegue

La forma más fácil de implementar Hasura para producción es usando Hasura Cloud . Esta es la opción recomendada, ya que obtiene funciones empresariales que no están disponibles en la versión de código abierto. Afortunadamente, Hasura no lo encierra en su plataforma, a diferencia de la mayoría de los proveedores de back-end como servicio (BaaS). Hay proveedores de servicios de implementación con un solo clic que puede aprovechar en plataformas como:

También puede implementar Hasura en cualquier plataforma de Kubernetes , como Google Cloud . AWS también es compatible, pero debe realizar una serie de pasos para que funcione. El alojamiento externo le brinda libertad y más opciones de precios. Sin embargo, todas las opciones anteriores requieren que configure servicios adicionales para:

  • autenticación
  • almacenamiento
  • lógica empresarial personalizada

En la siguiente sección, veremos brevemente cómo puede usar NHost para simplificar aún más el desarrollo de aplicaciones back-end de Hasura.

Implementación con NHost

NHost es un proveedor de BaaS de código abierto que pretende competir con plataformas como Firebase . Su backend stack consiste en:

  • Base de datos PostgreSQL
  • Motor Hasura GraphQL
  • un servicio de autenticación
  • MinIO , un servicio de almacenamiento de objetos compatible con S3
  • Funciones sin servidor (actualmente en beta)

La plataforma viene con una biblioteca de cliente llamada nhost-js-sdkque se utiliza para la autenticación frontend y la gestión de archivos. El servicio de almacenamiento admite la optimización de imágenes , lo que nos ahorra la molestia de integrar otro servicio para imágenes.

En el momento de escribir este artículo, NHost actualmente ofrece una prueba de 14 días para su servicio. Próximamente se lanzará un nivel gratuito. Hay una versión de Docker llamada Hasura Backend Plus que puede implementar localmente en su máquina.

Resumen

Para concluir, Hasura GraphQL Engine y la base de datos PostgreSQL son bastante revolucionarias en términos de la rapidez con la que puede crear backends para aplicaciones móviles y web, sin escribir líneas de código. PostgreSQL puede manejar la mayor parte de la lógica analítica y de cómputo, mientras que el resto de la lógica comercial personalizada se puede implementar mediante microservicios o funciones sin servidor.

Adoptar Hasura significa que podrá realizar un lanzamiento más rápido y crear un producto de alto rendimiento, seguro, tolerante a fallas, escalable y fácil de mantener. No tener problemas de infraestructura también reducirá sus costos operativos y le permitirá concentrarse en el desarrollo frontend y la parte de su aplicación orientada al usuario.

Aunque Hasura no tiene tantas funciones como otras alternativas de código abierto como la plataforma Parse , es compatible con el control de versiones y la puesta en escena del entorno, que es un requisito crucial para los flujos de trabajo de desarrollo de CI/CD. Debido a que es de código abierto, está protegido de los riesgos que plantean los bloqueos de proveedores.

Fuente: https://www.sitepoint.com/hasura-postgresql-build-backend/

#postgresql  #hasura 

Hire Backend Developers India

Are you looking to hire experienced Backend Developers at a reasonable cost to boost-up your IT business?

Hire Backend Developers India and accomplish their business goals swiftly. Backend developers in HourlyDeveloper.io are well versed in writing complex functional protocols. They also have exceptional hands-on experience in using the latest technologies that give you custom, secure, and strong backend layers for your website and applications.

Consult with experts:- https://bit.ly/2WlYvA7

#hire backend developers india #backend developers #backend development company #backend development services #backend development #backend

Hire Dedicated Backend Developers

Want to create a backend for a web or mobile app using PHP & JS frameworks?

Hire Dedicated Backend Developers who offer end-to-end, robust, scalable, and innovative website solutions. HourlyDeveloper.io technical analysts will also guide you on improving your web presence using their expertise. Also, we ensure your optimum level of freedom and control over your projects.

Let’s connect with our experts: https://bit.ly/2YLhmFZBackend Development Services

#hire dedicated backend developers #backend developers #backend development company #backend development services #backend development #backend

Como Criar Um Backend Com Hasura E PostgreSQL Para iniciantes

O desenvolvimento de back-end geralmente requer a escrita de muitas linhas de código que lidam com CRUD, autorização e lógica de negócios. Todo esse código precisa ser testado, depurado e mantido durante toda a vida útil do projeto. Isso leva muito tempo que os desenvolvedores podem usar para desenvolver novos recursos. Neste artigo, você aprenderá como Hasura e PostgreSQL podem ajudá-lo a acelerar o desenvolvimento de aplicativos e iniciar back-ends rapidamente com o mínimo de esforço.

Hasura é um mecanismo GraphQL de código aberto que gera terminais GraphQL e REST API usando seu esquema de banco de dados. Ele suporta modelagem de dados, consulta em tempo real, programação de eventos, autorização baseada em funções e ações para executar lógica de negócios customizada em GraphQL.

PostgreSQL é um banco de dados relacional orientado a objetos popular e poderoso, que oferece recursos de classe empresarial em um nível semelhante ao banco de dados Oracle e Microsoft SQL Server. O PostgreSQL é usado por grandes empresas internacionais como Netflix, Instagram, Uber e Spotify, de acordo com StackShare .

Neste artigo, veremos os principais recursos que o Hasura oferece e que o torna adequado para desenvolver e lançar back-ends escaláveis, tanto para web quanto para aplicativos móveis. Também veremos como você pode aproveitar os recursos do PostgreSQL para realizar várias tarefas computacionais e analíticas usando apenas SQL para fornecer os dados corretos ao seu front-end sem escrever código personalizado.

Observe que o Hasura também oferece suporte a outros bancos de dados, como Microsoft SQL Server, Amazon Aurora e Google BigQuery. Vamos nos concentrar no PostgreSQL, já que é gratuito e acessível para a maioria das empresas e organizações. O suporte para MySQL estará disponível em breve, caso você esteja interessado.

Se você é novo no GraphQL, confira nosso tutorial para saber mais. Vamos começar explicando porque o PostgreSQL pode ser a escolha perfeita para o seu projeto.

Por que PostgreSQL

Os bancos de dados relacionais têm muitas vantagens distintas sobre outros tipos de bancos de dados, pois você pode modelar seus dados usando esquemas estritos e relacionamentos de tabelas. A capacidade de realizar JOINs e transações ACID é um requisito importante para muitas aplicações na maioria dos setores. Esses recursos são essenciais para promover a integridade e consistência dos dados de negócios a qualquer momento.

PostgreSQL também tem vantagens adicionais sobre outros bancos de dados relacionais, como MySQL, em que:

  • você pode modelar dados usando herança de tabela
  • tem melhor controle de simultaneidade para ambientes multiusuário (você pode gravar grandes quantidades de dados de forma mais eficiente)
  • é tolerante a falhas e menos sujeito a corrupção de dados
  • ele suporta vários tipos de dados exclusivos, como JSON e Spatial , que é útil para aplicações financeiras e relacionadas à pesquisa

PostgreSQL não é apenas um serviço de armazenamento de dados. É também um servidor capaz de executar funções personalizadas e gatilhos para realizar várias tarefas computacionais e analíticas. A execução da lógica no PostgreSQL é mais eficiente, pois elimina a necessidade de escrever código de servidor personalizado. Você pode definir a lógica no PostgreSQL usando:

  • Views , uma consulta armazenada que pode ajudar a simplificar consultas complexas
  • Funções e operadores , como formatação de data, correspondência de padrões, operações aritméticas
  • Extensões , addons que estendem as capacidades do PostgreSQL (como PostGIS )
  • Linguagens procedurais , linguagens de programação para escrever funções definidas pelo usuário, procedimentos armazenados, gatilhos e extensão do SQL padrão (como PL / pgSQL )

Quando você implementa a lógica no PostgreSQL, o Hasura é capaz de expô-los a aplicativos front-end por meio de consultas GraphQL e mutações. Esta é uma visão de nível superior de um servidor PostgreSQL, conforme visto por meio da interface pgAdmin :

A interface do pgAdmin

Aprender a aproveitar as vantagens dos recursos do PostgreSQL pode ajudá-lo a resolver problemas complexos facilmente, sem escrever código de servidor. Aqui estão alguns exemplos do que você pode fazer com o PostgreSQL:

EXEMPLO 1

Você pode recuperar uma lista de usuários on-line que estão ativos no momento usando uma visualização :

CREATE OR REPLACE VIEW "public"."online_users" AS
 SELECT users.id,
    users.last_seen
   FROM users
  WHERE (users.last_seen >= (now() - '00:00:30'::interval));

EXEMPLO 2

Usando uma função PostGIS , você pode listar todas as lojas localizadas em um raio de 1.000 metros. Veja este tutorial de geolocalização para uma explicação detalhada:

SELECT id, name, address, geom
FROM Seattle_Starbucks
WHERE ST_DWithin(geom, ST_MakePoint(-122.325959,47.625138)::geography, 1000);

Na próxima seção, vamos nos concentrar nos recursos de Hasura.

O que é Hasura?

Hasura é um mecanismo GraphQL de código aberto e em tempo real que gera terminais GraphQL e REST API para seu banco de dados. Ele vem com um console da web que permite:

  • modele o esquema do seu banco de dados
  • visualizar, inserir, atualizar e excluir dados
  • implementar políticas de controle de acesso baseadas em funções
  • executar consultas e mutações GraphQL
  • criar endpoints REST
  • executar código SQL
  • definir ações e gatilhos

Painel API Hasura

Hasura não suporta autenticação de usuário, então você precisará integrar Hasura e seu aplicativo front-end com um provedor como:

Também não há serviço de armazenamento de arquivos, você precisará integrar seu aplicativo a um provedor de armazenamento de terceiros . Se você preferir uma experiência integrada mais out-of-the-box com Hasura, você pode verificar NHost , que discutiremos mais tarde na seção de implantação.

Na próxima seção, veremos como podemos executar Hasura localmente e na nuvem.

Lançando Hasura

Existem algumas maneiras de iniciar e executar rapidamente uma instância do Hasura:

1. Docker

Usar o Docker para executar o Hasura em sua máquina local é a maneira recomendada para configurar um ambiente de desenvolvimento. Com esta configuração, não há limite de taxa para solicitações de API e não há conexão de internet estrangulando sua experiência ao interagir com o console da web do Hasura. Qualquer trabalho que você fizer localmente pode ser facilmente migrado para ambientes de teste e produção. Discutiremos como isso é feito posteriormente na seção “Migrações e ambientes”.

Supondo que você já tenha o Docker e o Docker Compose instalados em sua máquina, você pode seguir as instruções fornecidas por este guia para executar o Hasura em sua máquina:

# create new directory
mkdir my-hasura
cd my-hasura

# download docker-compose.yml
curl https://raw.githubusercontent.com/hasura/graphql-engine/stable/install-manifests/docker-compose/docker-compose.yaml -o docker-compose.yml

# start hasura and postgresql container instances
docker-compose up -d

Você pode confirmar que as instâncias do contêiner Hasura e PostgreSQL estão em execução executando o comando docker ps. Você deve conseguir acessar sua instância local do Hasura através do seu navegador em http://localhost:8080/console. Para completar a configuração, você precisa se conectar ao banco de dados PostgreSQL, que está rodando como um contêiner junto com o de Hasura.

Com o banco de dados conectado, você poderá usar o console da web para criar tabelas, definir relacionamentos e realizar operações CRUD em seus dados. Observe que seus dados são públicos ao usar a configuração padrão do Docker. Você pode protegê-lo simplesmente removendo o comentário da linha que começa com HASURA_GRAPHQL_ADMIN_SECRETem seu docker-compose.ymlarquivo e reiniciando seu contêiner Hasura.

2. Nuvem

Uma maneira muito mais fácil de começar é por meio da nuvem Hasura . Esta é uma versão reprojetada do código aberto Hasura, projetada para escalabilidade, disponibilidade, segurança
e distribuição global.

O painel Hasura Cloud

 

 

Hasura Cloud vem com vários novos recursos não disponíveis na versão de código aberto, que incluem:

  • Painel de monitoramento de erros, conexões, assinaturas, consultas lentas e outras operações
  • Cache GraphQL para melhor desempenho de busca de dados do servidor e do cliente
  • Limitação de taxa para evitar que usuários mal-intencionados e ataques DDoS comprometam sua API
  • Teste de regressão para a execução de suítes de teste, como verificação de alterações em sua instância dev em relação à sua instância de produção

Para começar a usar Hasura Cloud, você precisa se inscrever para uma conta gratuita. Observe que a conta gratuita tem um limite de taxa de 60 solicitações por minuto. Depois de criar uma conta, você precisará:

  • Crie um projeto (uma instância Hasura)
  • Conecte-se a um banco de dados PostgreSQL

Por conveniência, Hasura Cloud fornece uma instalação com um clique e conexão a uma instância gratuita de banco de dados Heroku Cloud. Você também pode se conectar a qualquer outro banco de dados PostgreSQL acessível pela Internet. Existem muitos provedores de PostgreSQL que você pode usar. Isso inclui serviços em nuvem, como:

  • AWS
  • Azure
  • Oceano digital
  • TimescaleDB Cloud
  • YugabyteDB

Você pode seguir este guia se precisar de mais clareza com as etapas acima. Por padrão, Hasura Cloud restringe o acesso aos dados do público usando a chave secreta do administrador. Discutiremos mais sobre isso nas próximas seções.

Características Hasura

Nesta seção, darei a você uma visão geral de alto nível dos recursos que o Hasura oferece para construir um back-end personalizado sem escrever código.

Gerenciador de dados

Hasura vem com um designer visual para modelar sua camada de dados. Isso permite que você:

  • criar tabelas
  • definir relacionamentos (um para um, um para muitos, muitos para muitos)
  • realizar operações CRUD
  • criar visualizações
  • execute qualquer instrução SQL
  • implementar a validação de dados usando as restrições DDL do PostgreSQL
  • definir gatilhos

Hasura criar mesa

Quando se trata de colunas, Hasura oferece suporte a um rico conjunto de tipos de dados que incluem:

  • inteiros, numéricos e flutuantes
  • seriais e UUID
  • caracteres e texto
  • data e hora
  • boleano
  • geométrica - como linha, caixa, caminho, polígono e círculo
  • JSON

Você também pode adicionar tipos personalizados usando o CREATE TYPEcomando SQL. A seguir, veremos como os dados são autorizados no Hasura.

Autorização

O controle de acesso em Hasura é baseado em funções. Por padrão, há uma função chamada adminque tem acesso CRUD total aos seus dados. Para restringir o acesso a outros usuários, você precisará criar funções adicionais, como user, publicou accountant.

Para cada função criada, você precisa definir uma política de acesso para as seguintes ações:

  • inserir
  • selecionar
  • atualizar
  • excluir

Existem três tipos de políticas que você pode definir:

  • Acesso total , sem restrição
  • Acesso parcial , com restrições baseadas em condições
  • Sem acesso

O exemplo a seguir demonstra uma selectpolítica de autorização para a userfunção. As regras definidas a seguir são definidas para garantir que um usersó possa consultar seus próprios registros ou aqueles marcados como públicos:

 

 

Exemplo de autorização Hasura

Consultas

Depois de projetar seu esquema e definir permissões, você pode testar suas consultas GraphQL diretamente no painel de API do Hasura. Cada tabela, visão e relacionamento que você definiu podem ser consultados, desde que o rastreamento esteja habilitado.

Os tipos de consultas que você pode executar incluem:

  • Consultas simples : consultas SELECT que retornam um ou mais objetos.
  • Consultas aninhadas : consultas JOIN que retornam objetos em um formato aninhado com base em relacionamentos de chave estrangeira.
  • Consultas de agregação : consultas SELECT em que uma operação aritmética, como soma ou média, foi realizada nos resultados. Também pode ser aplicado a objetos aninhados.
  • Consultas de filtro / pesquisa : consultas WHERE que filtram dados usando operadores de comparação em um ou mais campos. Eles também podem ser usados ​​para realizar pesquisas usando correspondência de padrões ou difusa.

Consulta Hasura GraphQL

Os resultados da consulta GraphQL podem ser classificados , agrupados e paginados . A paginação baseada em cursor também é suportada. Basicamente, qualquer instrução SQL que possa ser executada no PostgreSQL pode ser exposta por meio de uma consulta GraphQL. Na próxima seção, veremos as mutações.

Mutações

Mutações GraphQL são instruções usadas para modificar dados. Abaixo estão os tipos de mutações que você pode realizar:

  • Inserir : crie uma ou mais linhas de dados:
  mutation insert_single_article {
    insert_article_one(
      object: {
        title: "Article 1"
        content: "Sample article content"
        author_id: 3
      }
    ) {
      id
      title
    }
  }
  • Upsert : criar, atualizar em conflito. No exemplo abaixo, a coluna valuepossui uma restrição única :
  mutation upsert_single_tag {
    insert_tags(
      objects: { value: "Java" }
      on_conflict: { constraint: tags_value_key, update_columns: value }
    ) {
      returning {
        id
        value
      }
    }
  }
  • Atualizar : atualiza uma ou mais linhas de dados. Existem também operadores especiais para trabalhar com inte jsonbtipos de dados. O exemplo abaixo atualiza todos os artigos com uma classificação menor ou igual a 2. A mutação retornará o número de linhas afetadas e também listará essas linhas como uma matriz de objetos:
  mutation update_article {
    update_article(
      where: { rating: { _lte: 2 } }
      _set: { rating: 1, is_published: false }
    ) {
      affected_rows
      returning {
        id
        title
        content
        rating
        is_published
      }
    }
  }
  • Excluir : exclui uma ou mais linhas de dados. O exemplo a seguir exclui um artigo por chave primária:
  mutation delete_an_object {
    delete_article_by_pk(id: 1) {
      id
      title
      user_id
    }
  }
  • Transação : execute várias mutações em um bloco de mutação. Se um deles falhar, todas as mutações executadas anteriormente nesse bloco serão revertidas. O exemplo a seguir primeiro exclui todos os artigos pertencentes a um autor. Na segunda mutação, o nome do autor é atualizado:
  mutation reset_author {
    delete_article(where: { author_id: { _eq: 6 } }) {
      affected_rows
    }
    update_author(where: { id: { _eq: 6 } }, _set: { name: "Cory" }) {
      returning {
        id
        name
        articles {
          id
          title
        }
      }
    }
  }

Assinaturas

As assinaturas de Hasura são consultas ao vivo executadas por meio de um protocolo WebSocket . Este é um protocolo usado para buscar dados em tempo real de um banco de dados. Qualquer consulta GraphQL pode ser transformada em uma assinatura simplesmente substituindo a palavra query- chave por subscription. Por padrão, essas consultas executam uma instrução SQL a cada segundo. Esta é uma definição configurável que pode ser ajustada para fornecer um equilíbrio adequado entre a carga e a latência do banco de dados. Se houver uma mudança nos dados subjacentes, o novo valor é enviado ao cliente.

O exemplo a seguir demonstra uma assinatura GraphQL que rastreia a localização de um veículo:

# $vehicleId = 3
subscription getLocation($vehicleId: Int!) {
  vehicle(where: { id: { _eq: $vehicleId } }) {
    id
    vehicle_number
    locations(order_by: { timestamp: desc }, limit: 1) {
      location
      timestamp
    }
  }
}

Outros casos de uso de assinaturas incluem:

  • rastreamento de entrega de comida
  • mensagens de bate-papo
  • enquetes online

Esquemas Remotos

Freqüentemente, ao construir um aplicativo moderno, você precisará integrar APIs de terceiros que:

  • fornecer dados que não estão em seu banco de dados - como placares ao vivo de esportes ou preço de ações
  • fornecer lógica de negócios - como processamento de pagamento ou reserva de voos

Essas APIs de terceiros geralmente são acessadas diretamente de aplicativos cliente. Com Hasura, você pode mesclar essas APIs com seu banco de dados para criar uma API GraphQL unificada. Isso cria novas oportunidades onde você pode implementar a autorização e definir relacionamentos remotos entre suas tabelas / visualização e a API remota. Você também pode criar Ações que executam uma determinada tarefa com base neste tipo de relacionamento.

Ter uma API GraphQL unificada torna mais fácil para os desenvolvedores de front-end construir o aplicativo. Na próxima seção, veremos o que são Ações Hasura.

Ações

A lógica de negócios personalizada no Hasura é tratada externamente em microsserviços ou funções sem servidor por meio de webhooks. Isso significa que você pode escrever lógica personalizada usando qualquer linguagem de sua preferência, como Node.js, Python, Go ou Ruby on Rails. Uma ação em Hasura é simplesmente uma consulta ou mutação GraphQL personalizada que mapeia para um webhook onde as interfaces de entrada e saída são definidas.

 

 

Uma definição de ação é composta de:

  • tipo: consulta ou mutação
  • nome da ação
  • tipos personalizados para entradas e saídas
  • cabeçalhos
  • URL do manipulador

Vejamos um simples “Hello, World!” exemplo. Primeiro, definimos uma consulta de ação da seguinte maneira:

type Query {
  hello(name: String!): HelloResponse
}

A ação acima define uma função chamada helloque aceita uma variável de string chamada namecomo entrada. A função retorna um HelloResponseobjeto, que é um tipo personalizado definido da seguinte maneira:

type HelloResponse {
  message: String!
}

Com a interface definida, tudo o que resta é a implementação do serviço webhook e uma URL que pode ser acessada por sua instância Hasura. Aqui está uma implementação escrita para Express.js que foi criada com a ajuda do assistente CodeGen de Hasura:

// Request Handler
app.post("/hello", async (req, res) => {
  // get request input
  const { name } = req.body.input;

  // success
  return res.json({
    message: `Hello, ${name}!`,
  });
});

Gatilhos de eventos

Em Hasura, você pode construir aplicativos usando uma arquitetura de software conhecida como programação orientada a eventos . Este é um padrão de design que desacopla o gerenciamento de estado complexo de um back-end monolítico e o transfere para microsserviços individuais ou funções sem servidor que executam a lógica de negócios. Isso permite a construção de aplicativos altamente robustos e escaláveis.

Com a programação de eventos, você pode lidar facilmente com muitos casos de uso, como:

No PostgreSQL, você pode criar gatilhos que executam instruções SQL ou procedimentos armazenados quando um evento como INSERT, UPDATEou DELETEocorre. Um gatilho está associado a uma tabela ou visualização e pode ser disparado antes ou depois de um evento.

Em Hasura, os gatilhos de evento são definidos de forma semelhante e são usados ​​para invocar web hooks quando um evento é disparado. Um web hook neste contexto é bastante semelhante aos que acabamos de discutir na seção “Ações”. Os gatilhos de evento também podem ser chamados manualmente por meio do console ou API.

Abaixo está um exemplo de uma definição de gatilho de evento no formato YAML:

- table:
    schema: public
    name: author
  event_triggers:
    - name: author_trigger
      definition:
        enable_manual: false
        insert:
          columns: "*"
        update:
          columns: "*"
      webhook: https://httpbin.org/post

Um acionador de evento pode ser definido com cabeçalhos (para fins de autenticação) e geralmente contém uma carga que é enviada ao serviço webhook para processamento de dados. A única resposta esperada é 200status. Os resultados reais, se necessário, são postados de volta por uma rota diferente - como postar uma mutação GraphQL ou enviar uma notificação por e-mail e assim por diante.

Os aplicativos de front-end podem receber os resultados por meio de consultas por meio de assinatura GraphQL. Esse tipo de arquitetura facilita a construção de aplicativos interativos em tempo real sem bloqueio que proporcionam uma ótima experiência do usuário. A base de código também é mais fácil de manter, testar e escalar para os desenvolvedores.

Gatilhos programados

Gatilhos programados são eventos baseados em tempo que executam lógica de negócios personalizada por meio de webhooks. Existem dois tipos que você pode definir:

  • Gatilhos CRON : usados ​​para eventos periódicos em um intervalo regular
  • Eventos pontuais programados : usados ​​para execuções pontuais

Os gatilhos programados podem ser criados por meio do console da web ou da API de metadados. A captura de tela abaixo mostra o exemplo do console da web.

 

 

Acionador de cron do console da web

A API de metadados permite a criação de eventos agendados usando o código do aplicativo. O exemplo abaixo mostra como você estruturaria a criação de um evento único usando a API:

{
  "type": "create_scheduled_event",
  "args": {
    "webhook": "https://my-awesome-serverless-fn.com/send-email",
    "schedule_at": "2022-07-20T12:45:00Z",
    "payload": {
      "email": "bob@ross.com"
    }
  }
}

Hasura fornece uma série de mecanismos de tolerância a falhas que garantem que os gatilhos programados sejam executados com sucesso. Por exemplo, digamos que um evento agendado para 14h não foi processado porque Hasura estava fora do ar às 13h59. Quando Hasura for colocado online novamente, ele irá reidratar eventos e executar novamente gatilhos programados perdidos com base em uma configuração de tolerância personalizável. A configuração padrão é seis horas.

Hasura também oferece uma configuração de nova tentativa flexível em caso de falhas de HTTP. Você pode configurar o número de tentativas e o tempo limite entre cada tentativa. Cada invocação de gatilho é registrada - que você pode acessar mais tarde para inspeção.

Os casos de uso para acionadores programados incluem:

  • enviando lembretes
  • geração de relatórios de fim de dia
  • exclusão de usuários inativos que não verificaram seus endereços de e-mail nos últimos 90 dias

Migrações e ambientes

O fluxo de trabalho de desenvolvimento ideal para qualquer projeto de software é configurar vários ambientes para desenvolvimento, preparação e produção. Esse fluxo de trabalho simplifica o teste e garante que os desenvolvedores não excluam acidentalmente ou corrompam dados de produção ao implantar novas versões de seu software.

Para transferir o estado de um ambiente de desenvolvimento para teste e produção, os arquivos de migração são necessários. Com Hasura, você precisará de:

  • arquivos de migração de banco de dados / SQL
  • Metadados Hasura

Os metadados Hasura são compostos de um instantâneo de arquivos de configuração que rastreiam:

  • relacionamentos
  • permissões
  • gatilhos
  • ações
  • Esquema GraphQL
  • esquema remoto

Você precisará instalar o Hasura CLI para poder criar e aplicar esses arquivos de migração a uma instância diferente do Hasura. Esses arquivos de migração podem ser versionados e atualizados incrementalmente conforme o esquema muda durante o desenvolvimento.

A criação e aplicação de arquivos de migração SQL são feitas usando o hasura migratecomando, enquanto os arquivos de migração de metadados são tratados usando o hasura metadatacomando. O comando CLI também permite:

  • reverter migrações aplicadas
  • criar migração de dados iniciais
  • redefinir arquivos de migração
  • arquivos de migração squash - isto é, substitua pequenas atualizações incrementais por uma atualização principal

Hasura tem uma imagem especial de migração Docker cli que aplica migrações automaticamente quando o servidor é iniciado. Esta imagem também contém a ferramenta Hasura CLI , que pode ser usada para executar scripts de CI / CD em seu fluxo de trabalho.

Desdobramento, desenvolvimento

A maneira mais fácil de implantar Hasura para produção é usando Hasura Cloud . Essa é a opção recomendada, pois você obtém recursos empresariais não disponíveis na versão de código-fonte aberto. Felizmente, o Hasura não bloqueia você em sua plataforma, ao contrário da maioria dos provedores de back-end como serviço (BaaS). Existem provedores de serviços de implantação com um clique que você pode aproveitar em plataformas como:

Você também pode implantar o Hasura em qualquer plataforma Kubernetes , como o Google Cloud . O AWS também é compatível, mas você precisa seguir várias etapas para fazê-lo funcionar. Hospedar externamente oferece liberdade e mais opções de preços. No entanto, todas as opções acima exigem que você configure serviços adicionais para:

  • autenticação
  • armazenar
  • lógica de negócios personalizada

Na próxima seção, veremos brevemente como você pode usar o NHost para simplificar ainda mais o desenvolvimento de aplicativos back-end Hasura.

Implantando com NHost

NHost é um provedor de BaaS de código aberto que visa competir com plataformas como o Firebase . Sua pilha de back-end consiste em:

  • Banco de dados PostgreSQL
  • Motor Hasura GraphQL
  • um serviço de autenticação
  • MinIO , um serviço de armazenamento de objetos compatível com S3
  • Funções sem servidor (atualmente em beta)

A plataforma vem com uma biblioteca cliente chamada, nhost-js-sdkque é usada para autenticação de front-end e gerenciamento de arquivos. O serviço de armazenamento oferece suporte à otimização de imagens , o que nos poupa do trabalho de integrar outro serviço de imagens.

No momento em que este artigo foi escrito, a NHost oferece atualmente um teste de 14 dias para seu serviço. Um nível gratuito será lançado em breve. Existe uma versão Docker chamada Hasura Backend Plus que você pode implantar localmente em sua máquina.

Resumo

Para concluir, o Hasura GraphQL Engine e o banco de dados PostgreSQL são bastante revolucionários em termos de rapidez com que você pode construir back-ends para aplicativos móveis e web, sem escrever linhas de código. A maior parte da lógica de computação e analítica pode ser tratada pelo PostgreSQL, enquanto o resto da lógica de negócios personalizada pode ser implementada usando microsserviços ou funções sem servidor.

Adotar o Hasura significa que você será capaz de lançar mais rápido e construir um produto de alto desempenho, seguro, tolerante a falhas, escalonável e fácil de manter. Não ter problemas de infraestrutura também reduzirá seus custos operacionais e permitirá que você se concentre no desenvolvimento de front-end e na parte voltada para o usuário de seu aplicativo.

Embora o Hasura não seja tão rico em recursos quanto outras alternativas de código aberto, como a plataforma Parse , ele oferece suporte a controle de versão e teste de ambiente, que é um requisito crucial para fluxos de trabalho de desenvolvimento de CI / CD. Por ser de código aberto, você está protegido dos riscos representados por lock-ins de fornecedores.

fonte: https://www.sitepoint.com/hasura-postgresql-build-backend/

#postgresql #hasura 

How to Build Your Backend with Hasura and PostgreSQL

Hasura is an open-source GraphQL engine that generates GraphQL and REST API endpoints using your database schema. It supports data modeling, real-time querying, event programming, role-based authorization and actions for running custom business logic over GraphQL.

PostgreSQL is a popular and powerful open-source, object-oriented relational database that offers enterprise-class features on a similar level with Oracle Database and Microsoft SQL Server. PostgreSQL is used by large international companies such as Netflix, Instagram, Uber and Spotify, according to StackShare.

In this article, we’ll go over the main features Hasura provides that makes it suitable for developing and launching scalable backends, for both web and mobile applications. We’ll also look at how you can leverage PostgreSQL’s features to perform various computation and analytical tasks using just SQL to deliver the right data to your frontend without writing custom code.

Do note that Hasura does support other databases as well, such as Microsoft SQL Server, Amazon Aurora and Google BigQuery. We’ll focus on PostgreSQL, since it’s free and accessible for the majority of businesses and organizations. Support for MySQL is coming soon, in case you’re interested.

If you’re new to GraphQL, please check out our tutorial to learn more. Let’s start with why PostgreSQL can be a perfect choice for your project.

Why PostgreSQL

Relational databases have many distinct advantages over other types of databases, in that you can model your data using strict schemas and table relationships. The ability to perform JOINs and execute ACID transactions is a major requirement for many applications in most industries. These features are essential to promoting integrity and consistency of business data at any given time.

PostgreSQL also has additional advantages over other relational databases such as MySQL, in that:

  • you can model data using table inheritance
  • it has better concurrency control for multi-user environments (you can write massive amounts of data more efficiently)
  • it’s fault tolerant and is less prone to data corruption
  • it supports a number unique data types such as JSON and Spatial, which is useful for finance and research-related applications

PostgreSQL isn’t just a data storage service. It’s also a server capable of running custom functions and triggers to perform various computation and analytical tasks. Running logic on PostgreSQL is more efficient, as it negates the need to write custom server code. You can define logic in PostgreSQL using:

  • Views, a stored query that can help simplify complex queries
  • Functions & Operators, such as date formatting, pattern matching, arithmetic operations
  • Extensions, addons that extends PostgreSQL’s capabilities (such as PostGIS)
  • Procedural Languages, programming languages for writing user-defined functions, stored procedures, triggers and extending the standard SQL (such as PL/pgSQL)

When you implement logic in PostgreSQL, Hasura is able to expose them to frontend applications via GraphQL queries and mutations. Here’s a top-level view of a PostgreSQL server, as seen via the pgAdmin interface:

The pgAdmin interface

Learning to take advantage of PostgreSQL features can help you solve complex problems easily without writing server code. Here are a few examples of what you can do with PostgreSQL:

EXAMPLE 1

You can retrieve a list of online users that are currently active using a view:

CREATE OR REPLACE VIEW "public"."online_users" AS SELECT users.id,    users.last_seen   FROM users  WHERE (users.last_seen >= (now() - '00:00:30'::interval));

EXAMPLE 2

Using a PostGIS function, you can list all stores that are located within a 1,000 meter radius. See this geolocation tutorial for a detailed explanation:

SELECT id, name, address, geomFROM Seattle_StarbucksWHERE ST_DWithin(geom, ST_MakePoint(-122.325959,47.625138)::geography, 1000);

In the next section, we’ll focus on Hasura’s features.

What is Hasura?

Hasura is an open-source, real-time GraphQL engine that generates GraphQL and REST API endpoints for your database. It comes with a web console that allows you to:

  • model your database schema
  • view, insert, update and delete data
  • implement role-based access control policies
  • run GraphQL queries and mutations
  • create REST endpoints
  • run SQL code
  • define actions and triggers

Hasura API dashboard

Hasura doesn’t support user authentication, so you’ll need to integrate Hasura and your frontend application with a provider such as:

There’s also no file storage service, you’ll need to integrate your app with a third-party storage provider. If you’d prefer a more out-of-the-box integrated experience with Hasura, you can check out NHost, which we’ll discuss later in the deployment section.

In the next section, we’ll look at how we can run Hasura locally and in the cloud.

Launching Hasura

There are a couple of ways you can quickly launch and run a Hasura instance:

1. Docker

Using Docker to run Hasura in your local machine is the recommended way for setting up a development environment. With this setup, there’s no rate limiting for API requests and there’s no internet connection throttling your experience when you interact with Hasura’s web console. Any work you do locally can easily be migrated to staging and production environments. We’ll discuss how this is done later in the “Migrations and Environments” section.

Assuming you already have Docker and Docker Compose already installed on your machine, you can follow the instructions provided by this guide to run Hasura on your machine:

# create new directory
mkdir my-hasura
cd my-hasura

# download docker-compose.yml
curl https://raw.githubusercontent.com/hasura/graphql-engine/stable/install-manifests/docker-compose/docker-compose.yaml -o docker-compose.yml

# start hasura and postgresql container instances
docker-compose up -d

You can confirm your Hasura and PostgreSQL container instances are running by executing the command docker ps. You should be able to access your local Hasura instance via your browser at http://localhost:8080/console. To complete the setup, you’ll need to connect to the PostgreSQL database, which is running as a container alongside Hasura’s.

With the database connected, you’ll be able to use the web console to create tables, define relationships and perform CRUD operations on your data. Do note that your data is public when using the default Docker setup. You can secure it by simply uncommenting the line that starts with HASURA_GRAPHQL_ADMIN_SECRET in your docker-compose.yml file and restarting your Hasura container.

2. Cloud

A much easier way of getting started is via Hasura Cloud. This is a re-engineered version of the open-source Hasura designed for scalability, availability, security
and global distribution.

The Hasura Cloud dashboard

Hasura Cloud comes with several new features not available in the open-source version, which include:

  • Monitoring dashboard for errors, connections, subscriptions, slow queries and other operations
  • GraphQL caching for improved server and client data fetching performance
  • Rate limiting for preventing malicious users and DDoS attacks from compromising your API
  • Regression testing for running test suites such as checking changes in your dev instance against your production instance

To get started with Hasura Cloud, you’ll need to sign up for a free account. Do note the free account has a rate limit of 60 requests per minute. After creating an account, you’ll need to:

  • Create a project (a Hasura instance)
  • Connect to a PostgreSQL database

For convenience, Hasura Cloud provides a one-click installation and connection to a free Heroku Cloud database instance. You can also connect to any other PostgreSQL database that’s accessible over the Internet. There are many PostgreSQL providers you can use. These include cloud services such as:

  • AWS
  • Azure
  • Digital Ocean
  • TimescaleDB Cloud
  • YugabyteDB

You can follow this guide if you need more clarity with the steps above. By default, Hasura Cloud restricts data access from the public using the admin secret key. We’ll discuss more about this in the upcoming sections.

Hasura Features

In this section, I’ll give you a high-level overview of the features that Hasura offers for building a custom backend without writing code.

Data Manager

Hasura comes with a visual designer for modeling your data layer. This allows you to:

  • create tables
  • define relationships (one-to-one, one-to-many, many-to-many)
  • perform CRUD operations
  • create views
  • run any SQL statement
  • implement data validation using PostgreSQL’s DDL constraints
  • define triggers

Hasura create table

When it comes to columns, Hasura supports a rich set of data types which include:

  • integers, numerics and floats
  • serials and UUID
  • characters and text
  • date and time
  • Boolean
  • geometric — such as line, box, path, polygon and circle
  • JSON

You can also add custom types using the CREATE TYPE SQL command. Next, we’ll look at how data is authorized in Hasura.

Authorization

Access control in Hasura is role based. By default, there’s a role called admin that has full CRUD access to your data. To restrict access to other users, you’ll need to create additional roles such as user, public or accountant.

For each role you create, you need to define an access policy for the following actions:

  • insert
  • select
  • update
  • delete

There are three types of policies you can define:

  • Full access, with no restriction
  • Partial access, with conditionally—based restrictions
  • No access

The following example demonstrates a select authorization policy for the user role. The rules defined below are set to ensure that a user can only query either their own records or those marked as public:

Hasura authorization example

Queries

After designing your schema and defining permissions, you can test your GraphQL queries right within Hasura’s API dashboard. Every table, view and relationship that you’ve defined can be queried, provided tracking was enabled.

The types of queries you can execute include:

  • Simple queries: SELECT queries that return one or more objects.
  • Nested queries: JOIN queries that return objects in a nested format based on foreign key relationships.
  • Aggregation queries: SELECT queries where an arithmetic operation such as sum or average has been performed on the results. It can also be applied to nested objects.
  • Filter/Search queries: WHERE queries that filter data using comparison operators on one or more fields. They can also be used to perform searches using pattern or fuzzy matching.

Hasura GraphQL query

GraphQL query results can be sorted, grouped and paginated. Cursor-based pagination is also supported. Basically, any SQL statement that can be run on PostgreSQL can be exposed via a GraphQL query. In the next section, we’ll look at mutations.

Mutations

GraphQL mutations are statements that are used to modify data. Below are the types of mutations you can perform:

  • Insert: create one or more rows of data:
  mutation insert_single_article {
    insert_article_one(
      object: {
        title: "Article 1"
        content: "Sample article content"
        author_id: 3
      }
    ) {
      id
      title
    }
  }
  • Upsert: create, update on conflict. In the example below, the column value has a unique constraint:
  mutation upsert_single_tag {
    insert_tags(
      objects: { value: "Java" }
      on_conflict: { constraint: tags_value_key, update_columns: value }
    ) {
      returning {
        id
        value
      }
    }
  }
  • Update: update one or more rows of data. There are also special operators for working with int and jsonb data types. The example below updates all articles with a rating that is less than or equal to 2. The mutation will return the number of affected rows and also list those rows as an array of objects:
  mutation update_article {
    update_article(
      where: { rating: { _lte: 2 } }
      _set: { rating: 1, is_published: false }
    ) {
      affected_rows
      returning {
        id
        title
        content
        rating
        is_published
      }
    }
  }
  • Delete: delete one or more rows of data. The following example deletes an article by primary key:
  mutation delete_an_object {
    delete_article_by_pk(id: 1) {
      id
      title
      user_id
    }
  }
  • Transaction: perform multiple mutations in one mutation block. If one of them fails, all previously executed mutations within that block will be rolled back. The following example first deletes all articles belonging to an author. In the second mutation, the author’s name is updated:
  mutation reset_author {
    delete_article(where: { author_id: { _eq: 6 } }) {
      affected_rows
    }
    update_author(where: { id: { _eq: 6 } }, _set: { name: "Cory" }) {
      returning {
        id
        name
        articles {
          id
          title
        }
      }
    }
  }

Subscriptions

Hasura’s subscriptions are live queries that execute over a WebSocket protocol. This is a protocol used for fetching real-time data from a database. Any GraphQL query can be turned into a subscription by simply replacing the keyword query with subscription. By default, such queries run an SQL statement every one second. This is a configurable setting that can be tuned to provide a suitable balance between database load and latency. If there’s a change in the underlying data, the new value is pushed to the client.

The following example demonstrates a GraphQL subscription that tracks the location of a vehicle:

# $vehicleId = 3subscription getLocation($vehicleId: Int!) {  vehicle(where: { id: { _eq: $vehicleId } }) {    id    vehicle_number    locations(order_by: { timestamp: desc }, limit: 1) {      location      timestamp    }  }}

Other use cases of using subscriptions include:

  • food delivery tracking
  • chat messaging
  • online polls

Remote Schemas

Often when building a modern application, you’ll need to integrate with third-party APIs that:

  • provide data that’s not in your database — such as sports live scores, or stock price
  • provide business logic — such as payment processing, or booking flights

These third-party APIs are usually accessed directly from client apps. With Hasura, you can merge these APIs with your database to create a unified GraphQL API. This creates new opportunities where you can implement authorization and define remote relationships between your tables/view and the remote API. You can also create Actions that perform a certain task based on this type of relationship.

Having a unified GraphQL API makes it easier for frontend developers to build the app. In the next section, we’ll look at what Hasura Actions are.

Actions

Custom business logic in Hasura is handled externally on microservices or serverless functions via webhooks. This means you can write custom logic using any language your prefer, such as Node.js, Python, Go or Ruby on Rails. An Action in Hasura is simply a custom GraphQL query or mutation that maps to a webhook where the input and output interfaces are defined.

An Action definition is made up of:

  • type: query or mutation
  • action name
  • custom types for inputs and outputs
  • headers
  • handler URL

Let’s look at a simple “Hello, World!” example. First, we define an Action query as follows:

type Query {  hello(name: String!): HelloResponse}

The Action above defines a function called hello that accepts a string variable called name as input. The function returns a HelloResponse object, which is a custom type that’s defined as follows:

type HelloResponse {  message: String!}

With the interface defined, all that’s left is the implementing the webhook service and a URL that’s accessible to your Hasura instance. Here’s an implementation written for Express.js that has been created with the help of Hasura’s CodeGen assistant:

// Request Handlerapp.post("/hello", async (req, res) => {  // get request input  const { name } = req.body.input;  // success  return res.json({    message: `Hello, ${name}!`,  });});

Event Triggers

In Hasura, you can build apps using a software architecture known as event-driven programming. This is a design pattern that decouples complex state management from a monolithic backend and defers it to individual microservices or serverless functions that execute business logic. This allows for the building of apps that are highly robust and scalable.

With event programming, you can easily handle many use cases, such as:

In PostgreSQL, you can create triggers that executes SQL statements or stored procedures when an event such as INSERT, UPDATE or DELETE occurs. A trigger is associated with a table or view and can fire before or after an event.

In Hasura, event triggers are similarly defined and are used for invoking web hooks when an event is fired. A web hook in this context is quite similar to the ones we just discussed in the “Actions” section. Event triggers can also be invoked manually via the console or API.

Below is an example of an event trigger definition in YAML format:

- table:    schema: public    name: author  event_triggers:    - name: author_trigger      definition:        enable_manual: false        insert:          columns: "*"        update:          columns: "*"      webhook: https://httpbin.org/post

An Event trigger can be defined with headers (for authentication purposes) and usually contains a payload that’s sent to the webhook service for data processing. The only response expected is 200 status. The actual results, if needed, are posted back through a different route — such as posting a GraphQL mutation, or sending an email notification, and so on.

Frontend apps can receive the results by querying through GraphQL subscription. This type of architecture makes it easy to build non-blocking interactive real-time apps that have great user experience. The codebase is also easier to maintain, test and scale for developers.

Scheduled Triggers

Scheduled Triggers are time-based events that execute custom business logic via webhooks. There are two types that you can define:

  • CRON triggers : used for periodic events at a regular interval
  • One-off scheduled events: used for one-off executions

Scheduled triggers can be created either via the web console or via the metadata API. The screenshot below shows the web console example.

Web console cron trigger

The metadata API allows creation of scheduled events using application code. The example below shows how you would structure the creation of a one-time event using the API:

{  "type": "create_scheduled_event",  "args": {    "webhook": "https://my-awesome-serverless-fn.com/send-email",    "schedule_at": "2022-07-20T12:45:00Z",    "payload": {      "email": "bob@ross.com"    }  }}

Hasura provides a number of fault-tolerance mechanisms that ensure scheduled triggers run successfully. For example, let’s say an event that was scheduled for 2:00pm wasn’t processed because Hasura was down at 1:59pm. When Hasura is brought back online, it will rehydrate events and re-run missed scheduled triggers based on a customizable tolerance configuration. The default setting is six hours.

Hasura also provides a flexible retry configuration in case of HTTP failures. You can configure the number of retries and the timeout between each retry. Every trigger invocation is logged — which you can access later for inspection.

Use cases for scheduled triggers include:

  • sending reminders
  • generating end-of-day reports
  • deleting inactive users who haven’t verified their email address within the last 90 days

Migrations and Environments

The ideal development workflow for any software project is to set up multiple environments for development, staging and production. This workflow simplifies testing and ensures developers don’t accidentally delete or corrupt production data when deploying new versions of their software.

In order to transfer the state of a development environment to staging and production, migration files are required. With Hasura, you’ll need:

  • database/SQL migration files
  • Hasura metadata

Hasura metadata is made up of a snapshot of configuration files that keeps track of:

  • relationships
  • permissions
  • triggers
  • actions
  • GraphQL schema
  • remote schema

You’ll need to install Hasura CLI to be able to create and apply these migration files to a different Hasura instance. These migration files can be versioned and updated incrementally as the schema changes during development.

Creating and applying SQL migration files is done using the hasura migrate command, while the metadata migration files are handled using hasura metadata command. The CLI command also enables you to:

  • roll back applied migrations
  • create seed data migration
  • reset migration files
  • squash migration files — that is, replace small incremental updates with one major update

Hasura has a special Docker cli-migration image that automatically applies migrations when the server starts. This image also contains the Hasura CLI tool, which can be used to run CI/CD scripts in your workflow.

Deployment

The easiest way to deploy Hasura for production is by using Hasura Cloud. This is the recommended option, since you get enterprise features not available on the open-source version. Fortunately, Hasura doesn’t lock you in to their platform, unlike most backend-as-a-service providers (BaaS). There are One-click Deploy service providers that you can take advantage of in platforms such as:

You can also deploy Hasura on any Kubernetes platform such as Google Cloud. AWS is also supported, but you have to go through a number of steps to get it working. Hosting externally does give you freedom and more pricing options. However, all the above options require you to set up additional services for:

  • authentication
  • storage
  • custom business logic

In the next section, we’ll briefly look at how you can use NHost to further simplify development of Hasura backend applications.

Deploying with NHost

NHost is an open-source BaaS provider that aims to compete with platforms such as Firebase. Their backend stack consists of:

  • PostgreSQL Database
  • Hasura GraphQL engine
  • an authentication service
  • MinIO, an S3 compatible object storage service
  • Serverless functions (currently in beta)

The platform comes with a client library called nhost-js-sdk which is used for frontend authentication and file management. The storage service supports image optimization, which saves us the hassle of integrating another service for images.

At the the time of writing, NHost currently provides a 14-day trial for its service. A free tier will be launched soon. There’s a Docker version called Hasura Backend Plus which you can deploy locally on your machine.

Summary

To conclude, Hasura GraphQL Engine and PostgreSQL database is quite revolutionary in terms of how fast you can build backends for both mobile and web applications, without writing lines of code. Most of the computation and analytical logic can be handled by PostgreSQL, while the rest of the custom business logic can be implemented using microservices or serverless functions.

Adopting Hasura means you’ll be able to launch faster and build a product that’s highly performant, secure, fault tolerant, scalable and easy to maintain. Having no infrastructure hassles will also reduce your operating costs and allow you to focus on frontend development and the user-facing part of your app.

Although Hasura isn’t as feature rich as other open-source alternatives such as Parse platform, it supports versioning and environment staging, which is a crucial requirement for CI/CD development workflows. Because it’s open source, you’re protected from risks posed by vendor lock-ins.

Source: https://www.sitepoint.com/hasura-postgresql-build-backend/

#postgresql #hasura