En publicaciones anteriores comentamos como usar Python en desarrollo de aplicaciones web haciendo uso de algunos frameworks, uno de ellos es Bottle. En esta serie de publicaciones explicaremos de manera gradual como hacer uso de Bottle para conectarnos a una base de datos, en este caso MySQL, para realizar funciones clásicas CRUD (Crear, Leer, Actualizar y Borrar). Pero nos centraremos en la parte de leer o consultar datos de una tabla MySQL.

Iremos explicando los procesos principales, de paso iremos aprendiendo de Bottle también y veremos sus ventajas y lo práctico que resulta. En próximas entregas veremos los temas de ingresar, actualizar y eliminar datos en este mismo proyecto.

Requisitos

Obviamente si vamos a trabajar con Python, debemos descargarlo e instalarlo en nuestra computadora. Hay varias guías al respecto, aunque ahora es mucho más fácil, ya que incluso la variable del sistema se configura automáticamente tras la instalación de Python. En nuestro caso hacemos uso de Python 3.7.4.

Bottle, el framework para crear aplicaciones web de manera rápida. Para usarlo antes debemos instalarlo. Ya con Python instalado, accedemos a la consola, o terminal de comandos, y escribir lo siguiente:

 pip install bottle

Como vamos a conectarnos y usar a una base de datos MySQL, debemos también instalar el modulo proporcionado por MySQL para ese propósito. En el terminal escribimos lo siguiente:

pip install mysql-connector-python

Tabla MySQL

Puedes añadir mas campos, o usar una tabla que ya tengas con datos. Para este ejemplo usamos la siguiente que usamos en proyectos anteriores.

CREATE TABLE `crud_employees` (
  `id` mediumint(9) NOT NULL,
  `names` varchar(150) NOT NULL,
  `address` varchar(200) NOT NULL,
  `date_register` date NOT NULL,
  `phone` varchar(12) NOT NULL,
  `comment` tinytext NOT NULL,
  `salary` decimal(10,2) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO `crud_employees` (`id`, `names`, `address`, `date_register`, `phone`, `comment`, `salary`) VALUES
(7, 'Jhon Williams', 'Calle Saint Seiya 239 Urb. Zodiaco', '2019-11-15', '+51 95418188', 'Compositor de grandes películas', '1200.50'),
(8, 'Anakin Skywalker', 'Calle Iron man #479 Urb. Vengadores', '2019-11-01', '+54 96385214', '', '1300.50'),
(9, 'Goku Sayayin', 'Calle Spiderman #678', '2019-11-15', '+61 98745632', '', '1400.60'),
(10, 'Tsubasa Olive Atom', 'Avenida Planeta de los Simios #998', '2019-11-18', '+84 96358742', 'Un buen juador de futbol', '1300.60'),
(11, 'Jhon Wick', 'Jiron Matones #785', '2019-11-07', '+1 852963250', 'Un gran profesional', '1800.00');
ALTER TABLE `crud_employees`
  ADD PRIMARY KEY (`id`);
ALTER TABLE `crud_employees`
  MODIFY `id` mediumint(9) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=13;
COMMIT;

Aplicación Python

Bien hasta ahora no hemos visto nada complicado aun ¿verdad? Vamos a entonces a usar los módulos que descargamos e instalamos: bottle y mysql-connector.

En un directorio que recuerdes bien, coloca el siguiente archivo que llamamos webapp.py, que es la parte principal de este proyecto. Luego lo comentaremos línea a línea.

from bottle import route, run, template, debug
import mysql.connector
@route('/list')
def list():
    cnx = mysql.connector.connect(user='root', password='',host='127.0.0.1',database='db_emocion')
    cursor = cnx.cursor()
    query = ("SELECT * FROM crud_employees")
    cursor.execute(query)
    result = cursor.fetchall()
    cursor.close()
    return template('list_template', rows=result)
debug(True)
run(host='localhost', port=8080)

Primeramente importamos los módulos necesarios, obviamente el primero de ellos es Bottle, y sus diferentes funciones: route, un enrutador (para leer las url); run, que ejecutará la aplicación web en el servidor web; template, carga el sistema de plantillas; y debug, que habilita el seguimiento de errores. Vamos a ver que los invocamos con un propósito.

También importamos el modulo para conectarnos a MySQL.

Con línea @route('/list'), estamos indicando que cuando usuario escriba dicha ruta o Url entonces se ejecutará la función list().

¿Y que hace dicha función? Primero creamos una variable de conexión con el método connect y los datos de acceso: como el nombre de servidor, base de datos, usuario y contraseña.

Creamos un cursor, que recorrerá los datos de las consulta, que es "SELECT * FROM crud_employees". El resultado de la consulta, pasará a la variable result.

La función retornará los datos a un template o plantilla, que en este caso se llamalist_template(que luego explicaremos) y como parámetro de retorno definimos rows que contendrá el resultado de la consulta.

Ya fuera de la función nos encontramos con debug(True), que habilita los mensajes de errores, en caso haya algunos, para depuración. Se recomienda que en modo de producción esto sea False.

Finalmente run(host='localhost', port=8080) ejecuta el servidor web, especificando el nombre y el puerto.

He tratado de simplificar el código, para efecto didácticos y sea fácil de digerir.

Plantilla

El punto anterior mencionamos que la función list(), devuelve los resultados de la consulta a una plantilla de nombre list_template. Ese archivo es que vamos a escribir ahora en el mismo directorio. Este archivo de plantilla llamado list_template.tpl contiene lo siguiente:

<!DOCTYPE html>
<html lang="es">
  <head>
    <meta charset="utf-8">
    <title>Python MySQL: Consulta</title>
  </head>
  <body>
    <p>La consulta arrojo lo siguiente resultados:</p>
    <table border="1">
    %for row in rows:
      <tr>
      %for col in row:
        <td>{{col}}</td>
      %end
      </tr>
    %end
    </table>
  </body>
</html>

Lo que hay en este archivo es el HTML, es la vista, con código incrustado del sistema de plantillas con el que cuenta Bottle. Recorreremos la variable que pasamos con la plantilla, es decir rows, mediante el bucle for mostraremos sus filas y columnas.

Ejecución

Si estas siguiendo está guía entonces mediante la consola accede a tu directorio y ejecuta la aplicación web.

python webapp.py

Esto iniciará el servidor web.

Si vamos a esa Url http://localhost:8080/, no veremos nada, ya que no especificamos nada al respecto en nuestro código:

Pero la Url que nos interesa y donde si definimos algo es esta: http://localhost:8080/list si seguiste la guía paso a paso, deberá mostrar lo siguiente:

Descargar los archivos del repositorio. Hasta una próxima entrega.