Migración de Excel a MySQL

Posted by in Bases de datos, MySQL

Hace mucho que no escribo sobre MySQL y también de Python, así que hoy te cuento cómo realizar una migración de una tabla que tengas en Excel a MySQL, todo esto usando Python.Y todo, en menos de 50 líneas. Esta entrada de hoy es una aproximación totalmente diferente a usar MySQL for Excel, de la que ya te conté hace tiempo.

Conocimientos previos

Para la solución que te propongo, he usado SqlAlchemy, y pandas. Evidentemente, necesitas disponer de un servidor MySQL.

SqlAlchemy es una libreria Object Relational Model, esto es ORM, que facilita la escritura de código Python que será el ORM el que se encargue de traducirlo al lenguaje de la base de datos. Yo no lo he utilizado en muchos proyectos, y la verdad, me es un poco incómodo escribir código Python que se va a ejecutar en la base de datos, así como no usar SQL, y hacerlo en un lenguaje Python, acomodado a las reglas impuestas por SqlAlchemy. No es que sea algo malo, pero es más una manía personal, y de hecho, no lo he utilizado en casi ningún proyecto.

Sin embargo, hoy es uno de esos momentos donde se puede sacar buen rendimiento de SqlAlchemy!

Pandas es la librería por excelencia para trabajar con datos en Python. Aunque con esta librería sí que he trabajado en múltiples proyectos, lo cierto es que por el blog la he nombrado poco. Pero bueno, alguna vez tendría que ser la primera!

Requisitos

Antes de seguir, doy por sentado que tienes instalado Anaconda, la mejor distribución de Python (a mi, es la que mñas me gusta y la que uso). Por si no lo tienes, te recomiendo que instales el cliente de MySQL de python con el comando:

pip install mysqlclient

mysqlclient

mysqlclient

El hecho de instalar este cliente es porque yo, que no lo tenía, recibí el error:

Error loading MySQLdb module: No module named 'MySQLdb'

Así que si te aparece ese error, ya sabes que es porque no dispones del cliente MySQL.

La segunda cosa a considerar es que necesitas tener instalado SqlAlchemy, (viene incluido en Anaconda!!) y lo puedes comprobar con:

import sqlalchemy

sqlalchemy

sqlalchemy

La tercera consideración viene que, para trabajar con UTF-8, es necesario disponer de la cadena de conexión correcta, y de hecho, me vino bien leer esta respuesta: https://stackoverflow.com/questions/16394332/unicodeencodeerror-latin-1-codec-cant-encode-characters-in-position-0-1-ordi.

El código de migración de Excel a MySQL

Ya tenemos todos los requisitos listos, ahora solo necesitas modificar las variables para ubicar la ruta, el fichero Excel, la solapa que se convertirá en tabla, y para MySQL, además de los datos de conexión, cómo quieres que se llame tu nueva tabla.

El código es este:

# coding: utf-8
# --------------------------------------------------------------------
# Name:       Excel 2 MySQL
# Copyright:   (c) ManejandoDatos.es 2019
# --------------------------------------------------------------------

__APP__ = "Excel 2 MySQL - Version %s (%s)"
__VERSION__ = "1.0.0"
__FECHA__ = "7 Marzo 2018"
nl = "\n"
print((__APP__ + nl) % (__VERSION__, __FECHA__))

ruta = r"C:\"
fichero = "file.xlsx"
solapa = "sheet_name"
tabla = "table_name"
host = "localhost"
user = "user"
passwd = "***"
database = "your_db"

try:
    import sys
    import pandas as pd
    from sqlalchemy import create_engine 

except Exception as e:
    print(" *** ERROR FATAL *** Error inicial al cargar librerias!! ")
    print(e)
    sys.exit(0)

def excel2mysql():
    try:
        try:
            xls = pd.ExcelFile(ruta + "\\" + fichero)
            x1 = xls.parse(solapa)
            x1.columns = map(str.lower, x1.columns)  # Columnas a lower
            engine = create_engine('mysql://%s:%s@%s/%s?charset=utf8&use_unicode=1' % (user, passwd, host, database), encoding='utf-8')
            with engine.connect() as conn, conn.begin():
                x1.to_sql(tabla, conn, if_exists='replace')
            print ("Migración terminada!")

        except Exception as f:
            print('Imposible conectar con Base de datos %s!! Revise datos de conexión!!' % (host))
            print(f)

    except Exception as e:
        print('ERROR!! Imposible abrir fichero')
        print(e)

if __name__ == '__main__':
    excel2mysql()


Sencillo, eh? Pues nada, si te ha gustado, ayuda al mantenimiento de este blog con una pequeña aportación!

Como información adicional, te recomiendo que uses la opción echo=True en create_engine para que vayas viendo todas las instrucciones SQL que van teniendo lugar en el proceso, aunque cuando te hayas acostumbrado a este pequeño script, te será prescindible!

También quiero hacer notar que hay que indicar que vas a trabajar con UTF-8 tanto en la cadena de conexión, como en la opción encoding de create_engine.

Happy coding!