Python, MySQL y como mezclarlos para hacer consultas

Siempre es interesante juntar Python y MySQL, de esta mezcla pueden resultar programas muy útiles.

Por ejemplo, se pueden hacer consultas a una base de datos y el resultado enviarlo por Telegram, guardarlo en una hoja de cálculo, enviar esa información por correo, hacer cálculos o simplemente mostrarlo en pantalla.

La potencia de una base de datos es guardar grandes cantidades de información para luego filtrarla a gran velocidad, las ventajas con muchas.

En este artículo verán un ejemplo sencillo de como hacer una consulta con Python a una base de datos MySQL ¡Comenzamos!

PyMySQL es el que hace la magia

Hacer consultas con Python es relativamente sencillo. Para lograr una conexión a una base de datos usé la librería PyMySQL.

Es importante recalcar que esta librería sirve tanto para MySQL como para MariaDB y no hay muchas diferencias en cuanto a su uso.

Para instalarla solo es necesario:

python3 -m pip install PyMySQL

Hecho esto lo que sigue es puro código.

Importar la librería y establecer la conexión.

Claro que para que este código funcione primero hay que tener un servidor MySQL junto con un usuario y contraseña que permita una conexión.

Veamos el siguiente ejemplo:

import pymysql

# Variables generales de conexión a la base de datos.
servidor_ip = '192.168.10.40'
usuario = 'usuariodb'
contraseña = '12345678'
base_de_datos = 'world'

# Establecemos la conexión con el servidor MySQL.
db = pymysql.connect(host=servidor_ip,
                     user=usuario,
                     password=contraseña,
                     database=base_de_datos,
                     charset='utf8',
                     cursorclass=pymysql.cursors.DictCursor)

SQL entra en acción

Llegó el momento de ponerse serios, el verdadero poder de un servidor de base de datos son las consultas.

A mi me gusta trabajar las consultas con editor gráfico como HeidiSQL para luego copiarla en el código.

HeidiSQL y su editor de consultas.

Esta es una base de datos de ejemplo que guarda información de países, ciudades y sus idiomas. Es la famosa base de datos World que se puede descargar para practicar.

Supongamos que queremos una lista de países que hablan Español. La consulta quedaría más o menos así:

# El cursor nos permite trabajar con la base de datos.
cursor = db.cursor()

# SQL entra en acción.
consulta = "SELECT country.Name " + \
    "FROM country " + \
    "INNER JOIN countrylanguage ON countrylanguage.CountryCode = Code " + \
    "WHERE Language = 'Spanish';"

Los resultados de la consulta

Ahora viene lo interesante, ejecutar la consulta y guardar los resultados en una variable en la que podamos trabajar.

# Ejecutamos la consulta :)
cursor.execute(consulta)

# Y los resultados los almacenamos en la variable datos.
datos = cursor.fetchall()

print(datos)

Pero si sólo hago un print(datos) el resultado es el siguiente:

[{'Name': 'Aruba'}, {'Name': 'Andorra'}, {'Name': 'Argentina'}, {'Name': 'Belize'}, {'Name': 'Bolivia'}, {'Name': 'Canada'}, {'Name': 'Chile'}, {'Name': 'Colombia'}, {'Name': 'Costa Rica'}, {'Name': 'Cuba'}, {'Name': 'Dominican Republic'}, {'Name': 'Ecuador'}, {'Name': 'Spain'}, {'Name': 'France'}, {'Name': 'Guatemala'}, {'Name': 'Honduras'}, {'Name': 'Mexico'}, {'Name': 'Nicaragua'}, {'Name': 'Panama'}, {'Name': 'Peru'}, {'Name': 'Puerto Rico'}, {'Name': 'Paraguay'}, {'Name': 'El Salvador'}, {'Name': 'Sweden'}, {'Name': 'Uruguay'}, {'Name': 'United States'}, {'Name': 'Venezuela'}, {'Name': 'Virgin Islands, U.S.'}]

Que visualmente no es muy agradable, así que vamos a enchular un poco el resultado de la consulta recorriendo el diccionario datos.

for i in datos:
    print(i['Name'])

Que da como resultado una salida mucho más legible:

Aruba
Andorra
Argentina
Belize
Bolivia
Canada
Chile
Colombia
Costa Rica
Cuba
Dominican Republic
Ecuador
Spain
France
Guatemala
Honduras
Mexico
Nicaragua
Panama
Peru
Puerto Rico
Paraguay
El Salvador
Sweden
Uruguay
United States
Venezuela
Virgin Islands, U.S.

Cierre la puerta al salir

Claro que una vez que todo termina, es una buena idea cerrar la conexión. Para evitar que el servidor le siga asignando recursos y este atento a las peticiones.

db.close()

Todo junto

Al final todo el código sería así

import pymysql

# Variables generales de conexión a la base de datos.
servidor_ip = '192.168.10.40'
usuario = 'usuariodb'
contraseña = '12345678'
base_de_datos = 'world'

# Establecemos la conexión con el servidor MySQL.
db = pymysql.connect(host=servidor_ip,
                     user=usuario,
                     password=contraseña,
                     database=base_de_datos,
                     charset='utf8',
                     cursorclass=pymysql.cursors.DictCursor)

# El cursor nos permite trabajar con la base de datos.
cursor = db.cursor()

# SQL entra en acción.
consulta = "SELECT country.Name " + \
    "FROM country " + \
    "INNER JOIN countrylanguage ON countrylanguage.CountryCode = Code " + \
    "WHERE Language = 'Spanish' " + \
    "ORDER BY Name;"

# Ejecutamos la consulta :)
cursor.execute(consulta)

# Y los resultados los almacenamos en la variable datos.
datos = cursor.fetchall()

for i in datos:
    print(i['Name'])

# Cerrar la conexión al terminar
db.close()
El programa funcionando ¡Cooool!

Conclusiones

Como ven las posibilidades son muchas, no solamente para hacer consultas, también es posible alimentar una base de datos de diversas fuentes, archivos de texto, hojas de cálculo, incluso desde la misma terminal.

¿Qué les pareció este artículo?

¿Saben de otra forma de hacer consultas a una base de datos MySQL con Python?

Conectar una base de datos MySQL con LibreOffice

El objetivo es poder usar información que ya tengo almacenada en una base de datos MySQL (supongo que también es posible con MariaDB) y utilizar esa información en los programas de LibreOffice.

De todos los programas que aparecen en LibreOffice el que parece más abandonado es Base. Actualmente estoy haciendo algunos experimentos con LibreOffice y MySQL, pero no me están resultando tan sencillo como esperaba.

Lo primero: Instalar el conector JDBC.

Hasta donde tengo entendido, para establecer una conexión con una base de datos en LibreOffice hay dos caminos. Usar un ODBC que es muy común en la plataforma de windows o con un JDBC (Java Database Connectivity). Como lo quiero hacer mi trabajo en Linux elegí esta última.

Descargué el que dice: Plataforma independiente.

Sigan el siguiente enlace para descargar el Connector. Elegí el que dice Plataforma Independiente. El formato no importa mucho, a fin de cuentas el archivo lo van a descomprimir y Linux soporta fácilmente archivos tar.gz como archivos zip.

Una vez descargado, hay que descomprimir los archivos en la carpeta que ustedes prefieran (tomen nota). Con eso terminamos este primer paso.

Agregar la clase del conector.

Para agregar la clase del conector (sea lo que sea que esto signifique) hay que abrir cualquier aplicación de LibreOffice, por ejemplo Calc.

Luego ir al menú HerramientasOpciones…  después en donde dice Avanzado , presionar el botón que dice: Ruta de clase…

Agregando la clase del conector.

Y agregar el archivo mysql-connector-java-5.1.44-bin.jar que descomprimimos en el paso anterior.

Lograr esto me llevó un buen rato. He tenido que leer muchos sitios, algunas cosas no me funcionaban, otras si. El proceso no es muy intuitivo que digamos. Eso de tener que lidiar con Java (que es de todos conocido que no soy fan) me resulta tortuoso, pero en fin, es lo que hay.

Pues una vez agregada la clase del conector podemos configurar una conexión a una base de datos MySQL con Base y por lo tanto con LibreOffice.

Agregar una base de datos MySQL a BASE.

Todo lo anterior ha sido para llegar a este paso. Abrimos BASE de LibreOffice y verán una pantalla como esta:

Conectar a una base de datos MySQL

A partir de este punto hay que seguir las indicaciones del asistente: Conectar mediante JDBC ¿recuerdan?.

Conectar mediante JDBC

Te preguntará cosas que un administrador debe saber, como el servidor, el nombre de la base de datos y sus credenciales (nombre de usuario y contraseña).

Prueba de conexión

Un pequeño detalle pero importante, si Registran esta información de conexión estará disponible en cualquier aplicación de LibreOffice ¡Interesante!.

Sí, registrar la base de datos.

Si todo salio bien verán que ahora pueden ver las tablas y hacer consultas con los datos.

Ejecutando una consulta SQL.

En otro artículo les voy a explicar cómo aprovechar esta información en Calc o en cualquier otro documento de LibreOffice.

¡Hasta la próxima!

P.D. Para ilustrar este artículo usé la base de datos world que está disponible en la documentación de MySQL y que sirve precisamente como datos de ejemplo para practicar.