Libro Python Aplicado de Eugenia Bahit. GNU/Linux, ciencia de datos, y desarrollo web

Banner de Python Aplicado

Conexiones a bases de datos con MySQL y MariaDB


Cita con formato IEEE:
E. Bahit, "Conexiones a bases de datos con MySQL® y MariaDB", in Python Aplicado, 4th ed., EBRC Publisher, 2022, pp. 245-257.

Cita con formato APA 7:
Bahit, E. (2022). Conexiones a bases de datos con MySQL® y MariaDB. In Python Aplicado (4th ed., pp. 245-257). EBRC Publisher.

Cita en línea:
(Bahit, 2022)

Para trabajar con bases de datos, en todo lenguaje se deben reunir dos requisitos:

  1. Un servidor de bases de datos (como MySQL®, MariaDB, PostgreSQL, entre otros).
  2. Un conector de base de datos para el lenguaje, que es el que permitirá al lenguaje interactuar con la base de datos.
Tener en cuenta que MariaDB es un fork de MySQL®. Por lo tanto, si se tiene por costumbre utilizar MySQL®, probablemente no se noten diferencias utilizando MariaDB.

En el caso de MySQL® existe un conector desarrollado por el fabricante, denominado MySQL Connector/Python. Se trata de una biblioteca privativa, no libre. Una versión libre con licencia GPL v3.0 es la biblioteca python-MySQLdb. Esta biblioteca sirve no solo para conexiones MySQL® sino también a MariaDB.

Recientemente en Junio de 2020, MariaDB lanzó su propio conector para Python, MariaDB Connector/Python. Hasta tanto transcurra el tiempo suficiente para considerarlo estable se recomienda utilizar MySQLdb. No obstante, se sugiere estudiarlo con la documentación oficial y mantenerse al día en cuanto a su avance.

Los paquetes a instalar tanto para Debian como para Fedora y distribuciones derivadas de ambos, son los siguientes:

  1. mariadb-server
  2. python3-mysqldb

Configuración y administración de MariaDB

Como usuario root, conectarse vía Shell a MariaDB:

# mariadb -u root

El objetivo es crear un usuario nuevo con permisos para crear bases de datos, y que pueda conectarse desde los scripts CGI:

CREATE USER <nombre> IDENTIFIED BY '<clave>';
GRANT ALL PRIVILEGES ON *.* TO <nombre>;

<nombre> y <clave> pueden ser cualquier cadena de texto que se desee, por ejemplo, el usuario eugenia con la clave secret:

CREATE USER eugenia IDENTIFIED BY 'secret';
GRANT ALL PRIVILEGES ON *.* TO eugenia;

A partir de aquí, es posible entrar al administrador de MariaDB con el nuevo usuario (y sin necesidad de hacerlo con el usuario root del sistema), y crear la nueva base de datos. La conexión (ahora con clave) se realizará con la instrucción:

$ mariadb -u eugenia -psecret

Y para crear una nueva base de datos se ejecutará:

CREATE DATABASE <nombre>;

Donde <nombre> será el que se le quiera dar a la nueva base de datos. Por ejemplo, nueva_db:

CREATE DATABASE nueva_db;

Algunas sentencias SQL para gestionar las bases de datos, y que podrían ser útiles de recordar, se describen en la siguiente tabla:

Sentencias SQL para gestión de bases de datos MariaDB (también válidas para bases de datos MySQL®)
Objetivo Sentencia
Crear base de datos CREATE DATABASE <nombre>;
Ver todas las bases de datos SHOW DATABASES;
Eliminar base de datos DROP DATABASE <nombre>;
Elegir una base de datos USE <nombre>
Crear una tabla con el motor InnoDB
(para bases de datos relacionales)
CREATE TABLE <nombre> (
  <campo1> <caracteristicas1>,
  <campon> <caracteristicasn>
) ENGINE=InnoDB;
Ver todas las tablas de una base de datos SHOW TABLES;
Ver la estructura de una tabla DESCRIBE <tabla>;
Eliminar una tabla DROP TABLE <nombre>;
Crear usuario CREATE USER <nombre>
IDENTIFIED BY '<clave>';

La lista completa [de sentencias SQL para gestión de bases de datos] puede verse en la documentación oficial de MariaDB y en la de MySQL®:

Trabajando con MariaDB y MySQL® desde Python

Teniendo el servidor de bases de datos y el conector correspondiente instalados, el acceso y consulta a bases de datos se realizará importando el conector:

from MySQLdb import connect

Para entender cómo funciona el acceso y consulta a una base de datos independientemente del servidor y del lenguaje, considerar que los pasos a seguir siempre serán los mismos:

  1. Abrir la conexión a la base de datos. Esto implica: conectarse a un host, autenticarse con un usuario y contraseña en el servidor de base de datos, y elegir la base de datos sobre la cual trabajar. La apertura de la conexión, la autenticación y la selección de la base de datos, suelen ser tres operaciones para las que los conectores ofrecen una sola que los ejecuta. En algunos lenguajes, pueden llevarse a cabo en tres operaciones independientes.
    Por otra parte, esta conexión abierta al comienzo es como un programa que se abre: necesita cerrarse al finalizar el trabajo.
  2. Abrir un cursor. Un cursor es una operación que se abre dentro de la conexión establecida, con la finalidad de almacenar los resultados devueltos por una consulta. Al igual que en el caso anterior, todo aquello que se abre debe cerrarse al finalizar el proceso.
  3. Ejecutar una consulta. Una consulta es la sentencia SQL que será ejecutada sobre la base de datos especificada.
  4. Confirmar cambios. Esta operación se realiza cuando se ejecutan instrucciones de escritura como INSERT, UPDATE o DELETE, entre otras.
  5. Recuperar los resultados de una consulta. Esta operación se realiza cuando se ejecutan consultas de lectura como SELECT, SHOW o DESCRIBE, entre otras.
  6. Cerrar el cursor abierto.
  7. Cerrar la conexión abierta.

El siguiente diagrama de flujo (flowchart) puede ayudar a memorizar y entender las operaciones necesarias para escribir el código fuente de funciones de manejo de bases de datos en cualquier lenguaje y para cualquier servidor:

[DIAGRAMA DE FLUJO NO DISPONIBLE EN LA VERSIÓN DEMO]

Cada una de estas operaciones tienen un nombre específico en Python, definido en las PEP 24922. Sus nombres se describen en la siguiente tabla.

Funciones Python para conectar y consultar bases de datos
Operación Nombre en Python
Abrir conexión connect
Abrir cursor cursor
Ejecutar consulta execute
Confirmar cambios commit
Recuperar resultados (todos) fetchall
Cerrar cursor (connect) close
Cerrar conexión (cursor) close

Cada una de estas operación será implementada según el conector elegido. En el caso de MySQLdb®, la implementación se realiza como se indica a continuación.