Diseño de aplicaciones

Uso de GraphQL con Golang y una base de datos NoSQL

Hace unas semanas había mencionado que estaba aprendiendo sobre el cada vez más popular GraphQL y cómo puede ser un reemplazo a la API RESTful común. En mi ejemplo anteriorvimos cómo crear una aplicación GraphQL utilizando Node.js y una aplicación Couchbase Base de datos NoSQL. Sin embargo, soy tan fan del lenguaje de programación Go como de Node.js.

Vamos a ver cómo crear una aplicación con Golang que pueda crear y consultar datos utilizando Consultas GraphQL en lugar de varios puntos finales de API RESTful.

Si no estás familiarizado con GraphQL, funciona pasando consultas desde un front-end al back-end y obteniendo de vuelta sólo los datos que has solicitado, independientemente de su procedencia o complejidad, en lugar de consumir datos de cualquier número de puntos finales de API potencialmente no relacionados. De este modo, se reducen tanto las solicitudes como la carga de datos, lo que agiliza el proceso y lo hace más eficiente.

Primeros pasos con GraphQL y Golang

Al igual que con una API RESTful, la mayor parte de una aplicación GraphQL consistirá en la configuración. Sin embargo, menos de una aplicación GraphQL dependerá de la planificación, que es diferente de una API RESTful que requiere una planificación pesada con el fin de seguir siendo fácil de usar.

Necesitamos instalar una dependencia del paquete GraphQL para Golang antes de poder continuar. Desde la línea de comandos, ejecute lo siguiente:

Con nuestra dependencia disponible, cree un nuevo proyecto dentro de su $GOPATH. Dentro de ese proyecto, cree un archivo llamado main.go e incluir lo siguiente que será nuestra base de aplicación:

Nuestro plan es crear una aplicación que pueda crear y consultar cuentas, así como crear y consultar entradas de blog para cualquier cuenta en particular. El modelo de datos de nuestra aplicación está definido por el módulo Cuenta y la estructura Blog estructuración. Este modelo de datos ayudará a alimentar nuestro modelo de datos de base de datos, así como nuestro modelo de datos GraphQL.

Cuando se trata de la configuración GraphQL, te darás cuenta de que hay algunos objetos creados. El accountType y el blogTipo representan el modelo de datos GraphQL que se creará alrededor de los Go structs. Aún no están configurados, pero lo estarán. El rootQuery será el conjunto de consultas que podemos ejecutar y el rootMutation será cualquier mutación de cambio de datos que se pueda ejecutar. Con GraphQL, no estás limitado a solo leer datos.

El esquema GraphQL nos permite definir qué son consultas y qué son mutaciones. Esto es necesario para cuando queramos consumir consultas. Aunque no estamos creando una API RESTful, seguimos necesitando un endpoint HTTP. Este único /graphql se encargará de todas las consultas y mutaciones y se alimenta del esquema.

Antes de conectar la base de datos, podemos definir nuestro esquema GraphQL:

Fíjate que sólo estamos definiendo nombres de propiedades y su correspondiente tipo de datos. Te dije que sería bastante similar a como hemos definido las estructuras de datos en Go.

Ahora vamos a centrarnos en cargar nuestro esquema con datos de Couchbase Server.

Consulta de datos de una base de datos NoSQL con GraphQL

Por ahora no hemos hecho ninguna preparación de la base de datos. El objetivo de este tutorial no es configurar Couchbase. Necesitarás Couchbase Server disponible con soporte N1QL, un Bucket, algunos índices y una cuenta de control de acceso basada en roles para la aplicación.

Desde la línea de comandos, ejecute las siguientes líneas para obtener nuestros paquetes de base de datos:

Los comandos anteriores nos conseguirán un paquete para crear valores UUID para claves de documentos, así como el SDK de Couchbase Go.

Ignorando todo lo que ya le hemos hecho a nuestro main.go eche un vistazo al siguiente código y ajústelo a lo que tiene donde tenga sentido:

Observa que hemos definido un Bucket que utilizaremos cuando interactuemos con la base de datos. Nos estamos conectando a un cluster de Couchbase en el directorio principal autenticándose con una cuenta RBAC, y abriendo un Bucket, todo lo cual debería haber sido definido antes de comenzar este tutorial.

Supongamos que ya tienes datos en tu base de datos. Vamos a empezar por intentar consultar los datos. ¿Recuerdas el siguiente trozo de código que se añadió anteriormente?

Cada campo existirá como un campo en Campos propiedad. Digamos que queremos obtener todas las cuentas de nuestra base de datos.

En el código anterior estamos creando un campo GraphQL llamado cuentas que devolverá una lista de accountType cuando se ejecuta. La dirección Resolver es la que hace el trabajo pesado. Opcionalmente podemos pasar parámetros de consulta, pero para este campo en particular no lo estamos haciendo. Al intentar consultar las cuentas, estamos creando una consulta N1QL que devuelve todas las propiedades y resultados posibles. La consulta GraphQL determinará cuáles de esas propiedades y resultados llegan al cliente.

Tomemos la siguiente consulta frontal que puede ejecutarse:

Mientras que podríamos conseguir el id, nombrey apellidoestamos optando por obtener sólo el id y nombre de nuestros resultados. Para ejecutar realmente la consulta, emitiremos una sentencia cURL como ésta:

Recuerde, nuestra consulta GraphQL se envía ver los parámetros de consulta a nuestro punto final de la API.

Veamos otra posible consulta GraphQL. Digamos que queremos consultar una cuenta en particular, no todas las cuentas. Podríamos crear un campo como el siguiente:

Si se consulta este campo, se obtendrá un único accountTypepero hay argumentos que se pueden pasar. Requerimos que un id y exigimos que sea una cadena. En el Resolverpodemos obtener el id y utilizarlo para obtener un documento NoSQL por la clave del documento. El resultado se devuelve y la consulta GraphQL determina qué propiedades se devuelven al cliente.

Tome la siguiente consulta:

En la consulta anterior, pasamos un ID y elegimos devolver sólo el nombre y apellido de los resultados. Para ejecutar realmente esta consulta, podemos emitir una sentencia cURL como la siguiente:

Supongamos ahora que queremos obtener todos los blogs de una cuenta de usuario determinada. Los pasos serán similares a los que vimos al consultar una cuenta concreta. Lo siguiente existiría como un campo en nuestro rootQuery:

El resultado será una lista de blogTipo y esperamos un cuenta en formato de cadena. Dentro del campo Resolver podemos obtener la función cuenta y utilizarlo en una consulta N1QL parametrizada. La consulta devolverá todas las entradas del blog sólo para una cuenta en particular basada en el valor cuenta valor.

La consulta para obtener todos los blogs podría tener el siguiente aspecto:

Lo anterior se parece bastante a lo que vimos al consultar una cuenta concreta. Estamos esperando una variable y estamos optando por devolver únicamente la variable id y el título propiedades.

¿Quieres ver una consulta bastante interesante basada en lo que tenemos hasta ahora? Echa un vistazo a la siguiente consulta:

En el ejemplo anterior estamos haciendo una única petición. Es una única consulta, pero estamos pidiendo los datos de la cuenta y los datos del blog de una cuenta en particular. Si lo hubiéramos hecho con una API RESTful habríamos realizado varias peticiones a nuestro servidor y habríamos hecho posibles mutaciones a nivel de aplicación.

El comando cURL tendría el siguiente aspecto:

Hasta ahora sólo hemos hecho consultas de lectura. ¿Y si quisiéramos hacer una mutación en la que creamos o alteramos datos?

Echemos un vistazo a las mutaciones de datos con GraphQL.

En lugar de trabajar en el rootQueryvamos a trabajar en el rootMutation. Para los campos, añada lo siguiente:

Observe que devolvemos un accountType y que esperamos que se pasen dos parámetros con nuestra consulta. Sin embargo, la estrategia en realidad no es diferente.

En el Resolver estamos obteniendo nuestros parámetros y usándolos para crear una nueva cuenta en la base de datos. Debido a que esto está vinculado a nuestro esquema como una mutación, estamos consultando de manera diferente.

En primer lugar, he aquí la consulta que querríamos ejecutar:

Fíjate en que estamos prefijando con la palabra mutación. En cURL, tendría el siguiente aspecto:

Ahora podría seguir creando campos que hagan consultas o mutaciones, pero los pasos son los mismos. Dejaré a tu imaginación que siga contribuyendo a esta idea de aplicación en particular.

Conclusión

Acaba de ver cómo utilizar GraphQL para consultar datos en una aplicación Golang que utiliza un archivo Base de datos NoSQL. GraphQL es muy útil si quieres dejar que el usuario defina qué datos quiere en una sola solicitud en lugar de crear incansablemente múltiples puntos finales de API RESTful que el usuario debe seguir. Es importante tener en cuenta que GraphQL no es un sustituto cuando se trata de que tu aplicación consulte tu base de datos. Usted todavía tendrá que crear consultas N1QL adecuadas en Couchbase. GraphQL sólo opera a nivel de cliente.

Para obtener más información sobre el uso de Go con Couchbase, consulte la página Portal para desarrolladores de Couchbase.

Comparte este artículo
Recibe actualizaciones del blog de Couchbase en tu bandeja de entrada
Este campo es obligatorio.

Autor

Publicado por Nic Raboy, Defensor del Desarrollador, Couchbase

Nic Raboy es un defensor de las tecnologías modernas de desarrollo web y móvil. Tiene experiencia en Java, JavaScript, Golang y una variedad de frameworks como Angular, NativeScript y Apache Cordova. Nic escribe sobre sus experiencias de desarrollo relacionadas con hacer el desarrollo web y móvil más fácil de entender.

Deja un comentario

¿Listo para empezar con Couchbase Capella?

Empezar a construir

Consulte nuestro portal para desarrolladores para explorar NoSQL, buscar recursos y empezar con tutoriales.

Utilizar Capella gratis

Ponte manos a la obra con Couchbase en unos pocos clics. Capella DBaaS es la forma más fácil y rápida de empezar.

Póngase en contacto

¿Quieres saber más sobre las ofertas de Couchbase? Permítanos ayudarle.