1647763200
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.
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:
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:
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 :
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:
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));
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.
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:
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.
Hay un par de formas de iniciar y ejecutar rápidamente una instancia de Hasura:
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_SECRET
en su docker-compose.yml
archivo y reiniciando su contenedor Hasura.
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.
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á:
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:
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.
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.
Hasura viene con un diseñador visual para modelar su capa de datos. Esto le permite:
Cuando se trata de columnas, Hasura admite un amplio conjunto de tipos de datos que incluyen:
También puede agregar tipos personalizados mediante el CREATE TYPE
comando SQL. A continuación, veremos cómo se autorizan los datos en Hasura.
El control de acceso en Hasura se basa en funciones. De forma predeterminada, hay un rol llamado admin
que tiene acceso CRUD completo a sus datos. Para restringir el acceso a otros usuarios, deberá crear funciones adicionales, como user
, public
o accountant
.
Para cada rol que cree, debe definir una política de acceso para las siguientes acciones:
Hay tres tipos de políticas que puede definir:
El siguiente ejemplo muestra una select
política de autorización para el user
rol. Las reglas definidas a continuación se establecen para garantizar que un user
solo pueda consultar sus propios registros o los marcados como públicos:
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:
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.
Las mutaciones de GraphQL son declaraciones que se utilizan para modificar datos. A continuación se muestran los tipos de mutaciones que puede realizar:
mutation insert_single_article {
insert_article_one(
object: {
title: "Article 1"
content: "Sample article content"
author_id: 3
}
) {
id
title
}
}
value
tiene 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
}
}
}
int
y jsonb
tipos 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
}
}
}
mutation delete_an_object {
delete_article_by_pk(id: 1) {
id
title
user_id
}
}
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
}
}
}
}
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 query
con 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:
A menudo, al crear una aplicación moderna, deberá integrarse con API de terceros que:
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.
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:
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 hello
que acepta una variable de cadena llamada name
como entrada. La función devuelve un HelloResponse
objeto, 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}!`, });});
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
, UPDATE
o . DELETE
Un 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 200
estado. 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.
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:
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.
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:
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:
Los metadatos de Hasura se componen de una instantánea de los archivos de configuración que realiza un seguimiento de:
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 migrate
comando, mientras que los archivos de migración de metadatos se manejan con hasura metadata
el comando. El comando CLI también le permite:
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.
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:
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.
NHost es un proveedor de BaaS de código abierto que pretende competir con plataformas como Firebase . Su backend stack consiste en:
La plataforma viene con una biblioteca de cliente llamada nhost-js-sdk
que 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.
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/
1647763200
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.
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:
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:
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 :
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:
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));
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.
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:
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.
Hay un par de formas de iniciar y ejecutar rápidamente una instancia de Hasura:
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_SECRET
en su docker-compose.yml
archivo y reiniciando su contenedor Hasura.
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.
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á:
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:
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.
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.
Hasura viene con un diseñador visual para modelar su capa de datos. Esto le permite:
Cuando se trata de columnas, Hasura admite un amplio conjunto de tipos de datos que incluyen:
También puede agregar tipos personalizados mediante el CREATE TYPE
comando SQL. A continuación, veremos cómo se autorizan los datos en Hasura.
El control de acceso en Hasura se basa en funciones. De forma predeterminada, hay un rol llamado admin
que tiene acceso CRUD completo a sus datos. Para restringir el acceso a otros usuarios, deberá crear funciones adicionales, como user
, public
o accountant
.
Para cada rol que cree, debe definir una política de acceso para las siguientes acciones:
Hay tres tipos de políticas que puede definir:
El siguiente ejemplo muestra una select
política de autorización para el user
rol. Las reglas definidas a continuación se establecen para garantizar que un user
solo pueda consultar sus propios registros o los marcados como públicos:
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:
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.
Las mutaciones de GraphQL son declaraciones que se utilizan para modificar datos. A continuación se muestran los tipos de mutaciones que puede realizar:
mutation insert_single_article {
insert_article_one(
object: {
title: "Article 1"
content: "Sample article content"
author_id: 3
}
) {
id
title
}
}
value
tiene 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
}
}
}
int
y jsonb
tipos 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
}
}
}
mutation delete_an_object {
delete_article_by_pk(id: 1) {
id
title
user_id
}
}
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
}
}
}
}
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 query
con 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:
A menudo, al crear una aplicación moderna, deberá integrarse con API de terceros que:
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.
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:
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 hello
que acepta una variable de cadena llamada name
como entrada. La función devuelve un HelloResponse
objeto, 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}!`, });});
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
, UPDATE
o . DELETE
Un 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 200
estado. 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.
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:
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.
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:
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:
Los metadatos de Hasura se componen de una instantánea de los archivos de configuración que realiza un seguimiento de:
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 migrate
comando, mientras que los archivos de migración de metadatos se manejan con hasura metadata
el comando. El comando CLI también le permite:
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.
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:
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.
NHost es un proveedor de BaaS de código abierto que pretende competir con plataformas como Firebase . Su backend stack consiste en:
La plataforma viene con una biblioteca de cliente llamada nhost-js-sdk
que 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.
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/
1594888728
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
1598859295
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
1640318673
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.
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:
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:
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 :
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:
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));
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.
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:
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.
Existem algumas maneiras de iniciar e executar rapidamente uma instância do Hasura:
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_SECRET
em seu docker-compose.yml
arquivo e reiniciando seu contêiner Hasura.
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.
Hasura Cloud vem com vários novos recursos não disponíveis na versão de código aberto, que incluem:
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á:
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:
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.
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.
Hasura vem com um designer visual para modelar sua camada de dados. Isso permite que você:
Quando se trata de colunas, Hasura oferece suporte a um rico conjunto de tipos de dados que incluem:
Você também pode adicionar tipos personalizados usando o CREATE TYPE
comando SQL. A seguir, veremos como os dados são autorizados no Hasura.
O controle de acesso em Hasura é baseado em funções. Por padrão, há uma função chamada admin
que tem acesso CRUD total aos seus dados. Para restringir o acesso a outros usuários, você precisará criar funções adicionais, como user
, public
ou accountant
.
Para cada função criada, você precisa definir uma política de acesso para as seguintes ações:
Existem três tipos de políticas que você pode definir:
O exemplo a seguir demonstra uma select
política de autorização para a user
função. As regras definidas a seguir são definidas para garantir que um user
só possa consultar seus próprios registros ou aqueles marcados como públicos:
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:
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 GraphQL são instruções usadas para modificar dados. Abaixo estão os tipos de mutações que você pode realizar:
mutation insert_single_article {
insert_article_one(
object: {
title: "Article 1"
content: "Sample article content"
author_id: 3
}
) {
id
title
}
}
value
possui 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
}
}
}
int
e jsonb
tipos 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
}
}
}
mutation delete_an_object {
delete_article_by_pk(id: 1) {
id
title
user_id
}
}
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
}
}
}
}
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:
Freqüentemente, ao construir um aplicativo moderno, você precisará integrar APIs de terceiros que:
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 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:
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 hello
que aceita uma variável de string chamada name
como entrada. A função retorna um HelloResponse
objeto, 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}!`,
});
});
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
, UPDATE
ou DELETE
ocorre. 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 é 200
status. 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 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:
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.
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:
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:
Os metadados Hasura são compostos de um instantâneo de arquivos de configuração que rastreiam:
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 migrate
comando, enquanto os arquivos de migração de metadados são tratados usando o hasura metadata
comando. O comando CLI também permite:
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.
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:
Na próxima seção, veremos brevemente como você pode usar o NHost para simplificar ainda mais o desenvolvimento de aplicativos back-end Hasura.
NHost é um provedor de BaaS de código aberto que visa competir com plataformas como o Firebase . Sua pilha de back-end consiste em:
A plataforma vem com uma biblioteca cliente chamada, nhost-js-sdk
que é 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.
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/
1647703811
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.
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:
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:
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:
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:
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));
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.
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:
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.
There are a couple of ways you can quickly launch and run a Hasura instance:
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.
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.
Hasura Cloud comes with several new features not available in the open-source version, which include:
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:
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:
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.
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.
Hasura comes with a visual designer for modeling your data layer. This allows you to:
When it comes to columns, Hasura supports a rich set of data types which include:
You can also add custom types using the CREATE TYPE
SQL command. Next, we’ll look at how data is authorized in Hasura.
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:
There are three types of policies you can define:
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:
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:
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.
GraphQL mutations are statements that are used to modify data. Below are the types of mutations you can perform:
mutation insert_single_article {
insert_article_one(
object: {
title: "Article 1"
content: "Sample article content"
author_id: 3
}
) {
id
title
}
}
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
}
}
}
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
}
}
}
mutation delete_an_object {
delete_article_by_pk(id: 1) {
id
title
user_id
}
}
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
}
}
}
}
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:
Often when building a modern application, you’ll need to integrate with third-party APIs that:
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.
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:
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}!`, });});
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 are time-based events that execute custom business logic via webhooks. There are two types that you can define:
Scheduled triggers can be created either via the web console or via the metadata API. The screenshot below shows the web console example.
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:
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:
Hasura metadata is made up of a snapshot of configuration files that keeps track of:
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:
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.
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:
In the next section, we’ll briefly look at how you can use NHost to further simplify development of Hasura backend applications.
NHost is an open-source BaaS provider that aims to compete with platforms such as Firebase. Their backend stack consists of:
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.
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/