miércoles, 12 de mayo de 2021

Apendice. Uso de MySql o MariaDB en un proyecto Flask.




La base de datos que he usado durante el desarrollo del proyecto está muy bien para aplicaciones simples, pero si queremos implementar un servidor web completo, que puede necesitar manejar multiples solicitudes a la vez, es mejor utilizar una base de datos más robusta. Por esa razón voy a explicar como configurar una base de datos de tipo MySql en concreto MariaDB.

MariaDb es una base de datos opensource basada en MySql y que es compatible con la misma.

Lo primero que haré será instalarlo. Para ello abrimos un terminal y comenzamos actualizando los repositorios:

$ sudo apt-get update
$ sudo apt-get full-upgrade

Una vez actualizado el software de la Raspberry, procedemos a instalar MariaDB:

$ sudo apt-get install mariadb-server 

Con esto ya tenemos instalado MariaDB. Ahora vamos a tratar de configurarlo. Para ello escribimos el siguiente comando:

$ sudo mysql_secure_installation

Este comando aunque se llame mysql se puede usar con MariaDB. Lo primero que nos pide es que escribamos nuestra contraseña actual, pero como acabamos de instalarla no tenemos ninguna por lo que simplemente le damos un Enter.



Luego nos pregunta si queremos establecer una contraseña para el usuario root. Yo no voy a ponerla con lo cual presiono "n". (pero tu puedes ponerla sin problemas)



A continuación nos pregunta si queremos eliminar los usuarios anónimos, lo que si vamos a hacer. Presionamos "y"



También nos pregunta si queremos desactivar el acceso remoto, a lo que contestamos que si ya que en nuestro proyecto todas las consultas a la base de datos se realizarán de forma local.



Nos preguntará si queremos eliminar la base de datos de prueba a lo que también contestamos que si. "y"



Y para finalizar nos dirá si queremos recargar los privilegios de la tabla ahora. Contestamos que si "y"



Y ya la tenemos configurada. Otra forma es dejar las opciones por defecto pulsando simplemente Enter a cada pregunta lo que viene a ser los mismo.



Para ver que versión tenemos instalada podemos teclear:

$ mysql --version



Bien ahora que ya lo tenemos preparado vamos a ejecutar MariaDB, 

$ sudo mysql



Este comando nos conecta con MariaDB y nos mostrará su prompt donde podemos crear base de datos, usuarios etc. 

Pero lo primero que tenemos que hacer es crear un usuario nuevo adicional con privilegios que es el que usaremos en nuestro proyecto. Ejecutaremos el siguiente comando:

MariaDB [(none)]> GRANT ALL ON *.* TO 'usuario'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;





En donde 'usuario' es el nombre del nuevo usuario que utilizaremos en nuestra base de datos.

En donde 'localhost' es la dirección de red de la base de datos, en nuestro caso al trabajar en local usaremos localhost.

En donde 'password' es la contraseña del usuario para la base de datos.

Voy a comprobar si todo ha quedado bien. Para ello reiniciamos la tabla para que pueda reconocer mi nuevo usuario.

MariaDB [(none)]> FLUSH PRIVILEGES;
Ahora ya podemos salir de la base de datos con:

MariaDB [(none)]> EXIT;
y testearemos si mariadb está ejecutándose  y el usuario ha quedado bien registrado.

$ sudo systemctl status mariadb







Vemos que el servicio mariadb esta activo y ejecutándose y si queremos saber más sobre el shell de MariaDB podemos usar:

$ sudo mysqladmin version




ffgfg

Vamos a testear nuestro nuevo usuario. Para ello nos volveremos a conectar con el nuevo usuario que hemos creado.

$ mysql -u usuario -p
Nos preguntará la contraseña que hemos definido antes y si todo ha ido bien, veremos algo como esto:








Y desde aquí ya podemos crear la base de datos que vamos a utilizar en el proyecto.

MariaDB [(none)]> create database mibase;
o si quieres crear la base de datos usando el juego de caracteres utf-8:

MariaDB [(none)]> CREATE DATABASE mibase CHARACTER SET utf8 COLLATE utf8_bin;
Nota: si te confundes de nombre de la base y quieres borrarla, si tienes permisos sobre ella puedes hacerlo con:

MariaDB [(none)]> DROP DATABASE nombre_de_la_base_a_borrar;  

Podemos ver si ha quedado correctamente creada usando el siguiente comando, que nos muestra las bases de datos que tiene asignadas mariadb:

MariaDB [(none)]> show databases;



En el post anterior de como desplegar una aplicación en raspberry pi hemos utilizado la aplicación del post 19 así que vamos utilizar ese ejemplo, para pasar de una base de datos sqlite que utiliza a MariaDB. 


IMPORTANTE: para que todo funcione correctamente tenemos que instalar un driver que haga de enlace o controle la base de datos MariaDB desde python. Esto es muy sencillo solo tenemos que instalar el  paquete pymysql dentro de nuestro entorno virtual.

Entramos en el entorno virtual de la aplicación de ejemplo:

pi@raspberry:~/miproyecto $ source ./miEntorno/bin/activate
e instalamos el siguiente paquete, que es el driver que nos va a servir de enlace:

(miEntorno) pi@raspberry:~/miproyecto $ pip install pymysql


Como ya vimos en el post 14 sobre Flask para dejar de usar sqlite y usar la base de datos que hemos creado tendremos que hacer unos sencillos pasos, además de instalar el driver que acabamos de  hacer.

1) En el archivo de configuración de nuestra aplicación (config.py) tenemos que cambiar el conector de sqlite y usar el conector de Mariadb.



Si usaste tu propio nombre de usuario, contraseña o nombre de la base de datos tendrás que modificarlo en el conector.

Los míos eran:

usuario = usuario
contraseña = password
nombre de la base de datos mariadb = mibase

2) Migración de la base de datos creada, pero no hemos adaptado su estructura a los campos que ya tenemos creados en la aplicación. Para eso tenemos que realizar una migración. Seguimos los siguientes pasos.

a) Instalamos, sino lo tenemos ya, el paquete flask-migrate

(miEntorno) $ pip install flask-migrate
Ahora tenemos que importarlo y declararlo en el archivo de la aplicación inicio.py.



Bien como nuestra aplicación inicial, no se llama app.py ni wsgi.py, tenemos que decirle a Flask, para que haga lo mostraré a continuación, cual es nuestra aplicación principal. Para ello solo tenemos que teclear lo siguiente:

(miEntorno) $ export FLASK_APP=inicio.py
Esto solo dura mientras tengas la sesión abierta, si la cierras y vuelves a entrar tendrás que teclearlo de nuevo.

Vamos al lio. Alembic (el framework de migración utilizado por Flask-Migrate) va a realizar los cambios en la estructura de la base de datos de forma que no tengamos que volver a crearla desde cero.  Pues bien, una vez que le hemos dicho a flask cual es nuestra aplicación principal tecleamos:

(miEntorno) $ flask db init
creating directory /14/migrations ...  done
  Creating directory /14/migrations/versions ...  done
  Generating /14/migrations/alembic.ini ...  done
  Generating /14/migrations/README ...  done
  Generating /14/migrations/env.py ...  done
  Generating /14/migrations/script.py.mako ...  done
  Please edit configuration/connection/logging settings in '/14/migrations/alembic.ini' before proceeding.

Después de haber ejecutado este comando te encontrarás un nuevo directorio en el directorio de trabajo llamado migrations con unos cuantos archivos y un subdirectorio llamado versions (que contendrá las modificaciones que hagamos a la estructura de la base de datos)

Cuando hagamos una migración, Alembic, comparará la estructura almacenada en sus directorios con la actual que tengamos definida en nuestro programa y realizará los cambios. Como esta es la primera vez que ejecutaremos el comando y previamente no hay nada, lo que hará será crear tanto el archivo de la base de datos como su estructura. Y lo creará en el directorio y con el nombre que hayamos especificado dentro del archivo de configuración del proyecto, en nuestro caso en:

# Cadena de conexion
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://usuario:password@localhost/mibase'
b) Realizamos la migración. Nos situamos en el mismo directorio donde está inicio.py, si no estamos ya, y tecleamos:

(miEntorno) pi@raspberry:~/miproyecto $ flask db migrate -m "migracion mariaDB"
INFO  [alembic.runtime.migration] Context impl MySQLImpl.
INFO  [alembic.runtime.migration] Will assume non-transactional DDL.
INFO  [alembic.autogenerate.compare] Detected added table 'usuario'
  Generating
  /home/pi/miproyecto/migrations/versions/2fa6cb75c75d_migracion_mariadb.py ...  done
El programa acaba de generar un script para poder migrar la base de datos con un identificador único 2fa6cb75c75d (en tu caso será otro distinto). El comentario de la opción -m es opcional y añade una breve descripción de texto a la migración.

c) Consolidar la migración. 

(miEntorno) pi@raspberrry:~/miproyecto $ flask db upgrade
INFO  [alembic.runtime.migration] Context impl MySQLImpl.
INFO  [alembic.runtime.migration] Will assume non-transactional DDL.
INFO  [alembic.runtime.migration] Running upgrade  -> 2fa6cb75c75d, migracion mariaDB

Y listo ya tenemos nuestra base de datos, mibase, con sus tablas y sus registros preparados y listos para trabajar. 


Instalar phpMyadmin para gestionar nuestra base de datos MariaDB.

PhpMyAdmin es una herramienta escrita en php con la intención de poder manejar bases de datos de tipo Mysql a través de páginas web, utilizando un navegador web. Con el podemos hace de todo en la base de datos mysql de una forma visual.

 Actualmente puede crear y eliminar Bases de Datos, crear, eliminar y alterar tablas, borrar, editar y añadir campos, ejecutar cualquier sentencia SQL, administrar claves en campos, administrar privilegios, exportar datos en varios formatos y está disponible en 72 idiomas

El método para realizar la instalación, es tener primero tanto el apquete mariadb-server como maríadb-client. Luego podemos instalar phpmyadmin con el siguiente comando:

  • $ sudo apt-get install phpmyadmin

Durante la instalación nos preguntará que servidor queremos utilizar para sevir las páginas si apache o ligthtpd. Si quieres usar nginx también se puede. Puedes conseguir información en esta web.

Si todo ha ido correcto al ir al navegador y teclear:

https://nombredelservidor_or_IP/phpmyadmin



Deberías ver la pantalla de bienvenida y a partir de ahí con el usuario que hemos definido previamente poder entrar en la aplicación.

Puedes encontrar más información sobre instalar phpMyAdmin es el blog "usuariodebian.blogspot.com"

Código del Capitulo en GitHub. Ten en cuenta que la base de datos mibase no está incluida tienes que crearla tu y cambiar el conector por el nombre de tu usuario y contraseña ya que se partio en el ejemplo de una base sqlite3.


Próximo Capítulo. Desplegar una aplicación de Flask en Heroku.

No hay comentarios:

Publicar un comentario