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
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
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!