Una herramienta para exportar código en SQL

Standard

Hola, mi nombre es Daniel López. Soy desarrollador de software e investigador (a.k.a Auror) en Hunabsys R&D. Tengo trabajando en la empresa desde Octubre del 2014 y ha sido toda una experiencia. En el viaje, me he topado con varios retos de programación, hoy les pienso compartir uno de ellos. Mi experiencia hablando Pársel, o como los muggles lo llaman: programando en Python (¡Así es Victor! Hice una publicación al respecto, maldito sangre sucia).

¿Qué y por qué?

En un enunciado: La idea fue pasar un modelo de base de datos en SQL a su versión en SQLite en Android. Si desconoces de SQLite y como integrar una base de datos en esta tecnología con Android, te encuentras en donde yo estaba. En caso contrario, quizá pienses: Fácil!, ¿cierto? ¡No tanto! Como bien dicen, el diablo está en los detalles y el detalle de este problema es cómo y qué tan fácil puede crecer el archivo SQL. Antes de empezar esta trágica historia de un programador en su viaje para encontrar la sabiduría y la iluminación, recapitulemos. Una base de datos es el componente que permite almacenar y consultar información en una aplicación. Debido a que estas operaciones son frecuentes, se opta por utilizar una herramienta conocida como magia! O si eres de Gryffindor la conoces como sistemas gestores de base de datos (SGBD). Los SGBDs representan la información como tablas. Existen diferentes SGBDs (como MySQL y SQLite), así como herramientas para el diseño de estos gestores. Nosotros en Hunabsys utilizamos MySQL Workbench para el diseño de la base de datos. Por último, si has vivido en las cavernas del banco de Gringotts,  Android un sistema operativo que permite la administración de un dispositivo móvil y otros electrónicos (TV, tablets, refrigeradores y uno que otro tejón mutante).

Bien, ahora sí te tocó la clase de mecanografía en la secundaria, eres un fan tremendo Facebook Chat o eres tan poderoso como “El que no debe ser nombrado”, puede que con una base de datos pequeña no tengas problemas. Pero, una base de datos con 20 tablas donde tengas que estar actualizando el modelo de base de datos (agregando y quitando elementos de una tabla o inclusive borrando y creando nuevas tablas), vas a tener problemas. Lo anterior se va a resumir como actualizar datos en dos herramientas diferentes (MySQLWorkbench y Android), traducido: Doble captura. Prefiero recibir la maldición crucio todos los días a realizar doble captura, nah! La verdad tampoco.

¿Qué hice?

Ahora les cuento cómo debió pasar y cómo es que pasó. Al final, utilizando magia prohibida: el lenguaje del heredero de la casa de Slytherin: Pársel, digo Python, logré resolver el problema.

Expectativa

Generar el modelo de la base de datos en MySQL Workbench, ir al menú Archivo, opción Exportar, opción “A Clase de Java para Android”, dar click en Aceptar e ir por una cerveza de mantequilla al Caldero Chorreando.

Realidad

Hasta la fecha de esta publicación, MySQL Workbench no cuenta con un encantamiento para exportar el modelo creado a algo que pueda utilizase en Android Studio (herramienta para programar una aplicación en Android). Por lo que todo lo que se haga en MySQL Workbench debe ser escrito a un archivo en Android Studio A M-A-N-O. Después de reunir al Consejo, se planteó la alternativa de realizar un programa para transformar el código de SQL a código que pueda ser utilizado en Android en el lenguaje de mi preferencia. En esos momentos estaba frustrado con el lenguaje de programación del basilisco sagrado: Python, por su enfoque sin tipos y casi mágico para liberar y asignar memoria. Pero esta oportunidad se presentó como un reto y decidí afrontarlo. Empezando a revisar la funcionalidad del lenguaje, la interpretación de SQL y la documentación de SQLite plantea la sintaxis de SQL con autómatas finitos. Decidí continuar con el enfoque de la documentación en SQLite y pasar a implementar la solución con los siguientes pasos.

  1. Generar el modelo de base de datos en MySQL Workbench.
  2. Exportar el modelo a un archivo SQL.
  3. Generar el autómata para reconocer la sintaxis de SQL.
  4. Interpretar el modelo con el script en Python.
  5. Generar el archivo para Android.

Pasos 1 y 2. Uso de MySQL Workbench

Los primeros dos pasos no tienen mayor complejidad que utilizar MySQL Workbench. Probablemente en otra ocasión tendré la oportunidad de comentarles un poco del modelado de una base de datos en la herramienta MySQL Workbench. Lo que se necesita para el siguiente paso es el modelo de la base de datos en sintaxis SQL.

Paso 3. Generar el autómata

Aquí necesitamos realizar un análisis del código SQL, generado por la herramienta MySQL Workbench. Para resolver esto, recordé la clase de “Modelos Formales de Cómputo” y el tema de Autómatas Finitos en el curso “Defensa contra  las artes obscuras”, el profe Lupin era un lunático. Con esto en mente y observando el esquema que SQLite presenta en su página para declarar una tabla, es sencillo pasar al autómata para reconocer la sintaxis para crear una tabla.

El autómata procesa el archivo SQL línea por línea. Al iniciar, el autómata está en el estado de identificación de tablas, donde busca la instrucción CREATE TABLE, en caso de no encontrarla pasa a procesar la siguiente línea de código. Una vez que encuentra la instrucción create, pasa al estado de agregar tabla, donde obtiene el nombre de la tabla y añade esta tabla a un conjunto de tablas  identificadas. Después pasa al estado de extracción de atributos, donde el objetivo es ubicar y agregar todos los atributos de la tabla ubicada en el estado anterior. En este punto el autómata puede pasar a dos estados extracción de constraints o identificación de tablas. Si el autómata observa un constraint (llave primaria o llave foranea) pasa al estado de extracción de constraints y se mantiene en ese estado ubicando y agregando las llaves. En caso de ubicar el fin de tabla, pasa al estado de identificación de tablas. En caso de que el autómata termine de procesar el archivo, pasa al estado de fin de archivo y termina su cómputo. Esto se ilustra en la Figura 1, donde está expresado el autómata de manera gráfica.

final_automata_small
Figura 1. Autómata para procesar el archivo SQL

Paso 4. Implementar el autómata en Python

Ahora para desarrollar el autómata en el lenguaje de programación Python, se utilizó la estructura básica del autómata expresada en la Figura 2. Los estados de la estructura corresponden a los estados incluidos en la Figura 1. Solo falta incluir la funcionalidad para procesar el archivo SQL (jeje fácil y casual).

actualState = initalState
while not isEndOfFileState(actualState):
 
	# Define where to stop
	if isEndOfFile():
		actualState = endOfFileState
	else:
		actualLine = currentLine()
 
	# Detect the CREATE TABLE Statement
	if isInitialState(actualState):
 
	# Ignore CREATE TABLE and get the table name
	elif isCreateState(actualState):
 
	# Get the table attributes
	elif isAttributeState(actualState):
 
	# Get the constraints
	elif isConstraintState(actualState):

Figura 2. Estructura del autómata en Python 

Paso 5. Generar un archivo para Android

Al terminar el cómputo del autómata, se ejecuta una función para imprimir el código de la clase en Android. Esta operación recorre las estructuras donde se agregaron las tablas, los atributos de cada tabla y las llaves primarias y foráneas. La impresión del código es en pantalla, de donde puede ser inyectada a un archivo de texto. Por último, el código fuente del autómata está disponible en aquí.

Así termina mi aventura con Python. Al final pude aprender mucho del lenguaje, ahora me quejo menos de sus operaciones mágicas. Espero les haya gustado esta publicación. En próximas publicaciones les comentaré de otros retos de programación o de mis perros: El Stinky y la Bola, son los mejores :). Hasta la próxima!

Referencias

Leave a Reply

Your email address will not be published. Required fields are marked *