Conectar GoLang y MySQL

Publicado por parzibyte en

Conectar Go y MySQL. Crud y ejemplos de conexión

Hoy veremos cómo consumir una base de datos de MySQL o MariaDB (crear un CRUD) utilizando uno de mis lenguajes de programación favoritos: Go, también conocido como GoLang.

Lo que haremos será un CRUD a través de la consola; esto para mantener la simplicidad, pero recuerda que Go sirve para muchísimas cosas más (Sublime POS está escrito en Go).

Conectar Go y MySQL. Crud y ejemplos de conexión

Conectar Go y MySQL. Crud y ejemplos de conexión

Recuerda que para esto debes tener instalado MySQL, si lo deseas, puedes instalarlo con XAMPP. También recuerda instalar y configurar Go.

Por otro lado, te invito a leer algunos ejercicios de MySQL y cómo conectarte a la CLI del servidor MySQL.

Explicación de lo que haremos

Al terminar este post, tendremos una pequeñísima app que registre contactos. Algo así como una agenda, en donde tendremos el nombre, la dirección y el correo electrónico. Para ello implementaremos las operaciones básicas como son:

  • Conexión a MySQL desde Go
  • Crear datos con insert
  • Leer datos de una tabla de MySQL con select
  • Actualizar datos existentes de MySQL
  • Eliminar un dato de una tabla de MySQL a través de su ID

Esto me recuerda a que ya hice un ejemplo de MySQL y Python hace algún tiempo.

Instalar librería para conectar Go con MySQL

Ejecutamos este comando para instalar la librería:

go get -u github.com/go-sql-driver/mysql

Por cierto, pásate por el repositorio de GitHub a dejarle una estrella o a contribuir. Ah, también debes tener instalado git en tu PATH, mira aquí cómo hacerlo en Windows.

Estructura de la tabla

No vamos a ver buenas prácticas de bases de datos, ni relaciones, ni cosas de esas. Haremos nuestra estructura lo mejor posible, pero no enfocándonos en la misma.

Conexión

Aquí asumo que ya leíste los tutoriales de MySQL que dejé arriba, y que también sabes tu contraseña, usuario y esas cosas. La conexión es así:

La parte más importante es en donde hacemos la conexión. Ahí especificamos la contraseña, el host, el usuario y el nombre de la base de datos. El host siempre es localhost, pero puede que en tu caso sea otro (qué tal si es un servidor remoto), igualmente puedes cambiar el puerto.

Los errores más comunes son los siguientes:

Cuando especificamos mal la IP o el puerto: Error conectando: dial tcp 127.0.0.1:3306: connectex: No se puede establecer una conexión ya que el equipo de destino denegó expresamente dicha conexión.

Si no ponemos el usuario o la contraseña correcta: Error conectando: Error 1044: Access denied for user ”@’localhost’ to database ‘agenda’

En caso de que no exista la base de datos: Error conectando: Error 1049: Unknown database ‘agenda’

Esta función la vamos a estar llamando desde las otras funciones del CRUD, así podemos obtener la base de datos desde cualquier lugar. No olvides manejar propiamente la base de datos, por ejemplo cerrarla al final con db.Close() y comprobar siempre si err no es nulo con if err != nil.

Nota: el ping no siempre es necesario, ya que igualmente si queremos hacer una consulta y algo anda mal, se nos notificará. Digo esto para evitar confusiones más tarde.

Abstraer todo en una clase

Yo sé que esto no es una clase, porque para empezar esto no es Java (qué alivio), pero vamos a poner todo en algo que yo llamo clase, lo que en realidad es un tipo struct que definimos nosotros. Esto representará a nuestro contacto:

Tiene todo lo que tiene nuestra base de datos. Este struct nos lo estaremos pasando para hacer todas las operaciones.

Insertar datos a MySQL con Go

Ahora veamos la operación de insertar o crear datos. Para ello creamos esta función:

La función recibe un struct que define un Contacto. Regresa un error. Siempre debemos comprobar si los errores son nulos.

En caso de que no haya error, regresará nil. Estamos previniendo inyecciones SQL porque preparamos la sentencia antes de ejecutarla; es decir, no concatenamos.

También estamos reutilizando la función obtenerBaseDeDatos.

Leer datos de una tabla en MySQL con Go

Toca el turno de la operación select. Ahora leeremos todos los datos y regresamos un arreglo con los mismos. No recomiendo hacer esto en la vida real (¿por qué alguien iba a querer todos los datos en un arreglo?), y si lo hacemos, recuerda hacerlo con arreglos pequeños.

En este caso regresamos todos los existentes porque es algo educativo. La función queda así:

Regresa un arreglo de structs de tipo Contacto. ¿Ya vieron cómo está sirviendo el struct que creamos hace un momento? igualmente, como segunda respuesta regresa un error que siempre debemos revisar.

Para iterarlo podemos usar un range en un for, así:

De esta manera se imprime el struct, ya con eso podemos ver cómo podemos leer datos de MySQL usando Go.

Actualizar datos de una tabla en MySQL con Golang

El tercer pilar de un CRUD es Update. Veamos cómo actualizar un datos de una tabla en MySQL usando Go. En este caso, crearemos una función que recibe un struct de tipo contacto, del que leerá el id y a partir de él actualizará. Queda así:

Recibe, de nuevo, un struct de tipo Contacto. Y devuelve un error que puede ser nulo. Lo importante aquí es la consulta.

Cabe mencionar que no necesariamente debemos actualizar todos los campos, pero lo hacemos para ejemplificar todo lo que se puede alcanzar. Para llamarlo podemos hacer esto:

Ese struct puede ser creado por nosotros, o a través del usuario.

Eliminar datos de MySQL o MariaDB desde Go

El último paso del CRUD es DELETE. Vamos a ver cómo eliminar un registro a través de su id. La función ahora queda así:

Aquí puede que nos preguntemos, ¿por qué no recibir un id entero? y la respuesta es que depende de nosotros. Yo lo dejo así por si en un futuro necesito saber más cosas de Contacto.

¿Qué tal si necesitamos loguear el nombre del contacto? o tal vez enviarle un correo antes de eliminarlo, cosas de esas.

Para implementar la eliminación, podemos usar este fragmento. En ese caso sólo proporcionamos el Id, pero podemos llenar los más datos.

Así es como terminamos este CRUD de MySQL + Go. Es hora de poner todo junto.

Poniendo todo junto

Como esta app se ejecutará en consola vamos a hacer un pequeño menú y dar opciones al usuario.

Un sencillo ciclo While en donde implementamos la lectura de datos por teclado V1 y también la versión 2 para leer la elección del usuario. La diferencia entre las mismas es que la primera lee toda la línea, y la segunda lee hasta encontrar un espacio en blanco.

Código final: CRUD en Go y MySQL

Finalmente, si te da pereza juntar todo, aquí dejo el código completo:

Así es como terminamos. Fue un tutorial extenso pero cumple con su propósito. No te quedes con esto, te invito a leer más ejemplos en la Wiki de la librería.

Más tutoriales de: MySQL | Bases de Datos | Go


parzibyte

He trabajado por más de 4 años en el desarrollo de software con experiencia en Java, PHP, JavaScript, HTML, Node.JS, Python, Android y Go. También he trabajado con bases de datos SQL como MySQL y SQLite, así como con bases de datos NoSQL usando MongoDB.Soy bueno utilizando algunos frameworks y herramientas como Firebase, jQuery, AngularJS, VueJS, CodeIgniter, Laravel, BulmaCSS, Bootstrap y Electron.Otros términos que conozco son: Arduino, GraphQL, API's, REST, AJAX, PouchDB, CouchDB, Experiencia de usuario, buenas prácticas de programación, Webpack, NPM, Administración de servidores y programación de scriptsLa plataforma en la que tengo más experiencia es la web, pero en mis ratos libres realizo unos pequeños ejercicios en C# y C.Estoy aquí para ayudarte a resolver tus problemas de programación y depuración :-)

3 Comments

Apositivo · enero 16, 2019 a las 3:54 pm

Execlente tutorial ! . de verdad el mejor , felicitaciones, simple y bien explicado !

Rodrigo · abril 12, 2019 a las 1:32 am

Excelente tutorial, te agradezco el tiempo que te tomaste para hacer que otros aprendan desde cero este gran lenguaje.
Saludos.

    parzibyte · abril 12, 2019 a las 9:41 am

    Gracias por tus comentarios 🙂 más tutoriales de Go vienen en camino, te invito a suscribirte a mi blog y a seguirme en mis redes sociales.
    Saludos

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

A %d blogueros les gusta esto: