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:
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.