Flask

Flask

Tutorial Flask: MySQL con SQLAlchemy en Flask

Descubre cómo instalar y configurar MySQL para uso con Flask y SQLAlchemy en sensibilidad y fluidez. Aprende de manera práctica y sencilla.

Aprende Flask GRATIS y certifícate

Instalación de MySQL

Para comenzar a trabajar con MySQL en Flask, es necesario instalar el servidor de bases de datos MySQL en tu sistema. A continuación, se detalla el proceso de instalación en los sistemas operativos más utilizados.

En Linux (Ubuntu/Debian):

En sistemas basados en Debian, puedes instalar MySQL utilizando el gestor de paquetes APT. Abre una terminal y ejecuta:

sudo apt update
sudo apt install mysql-server

Durante la instalación, es posible que se te solicite establecer una contraseña para el usuario root de MySQL. Asegúrate de elegir una contraseña segura.

En macOS:

En macOS, la forma recomendada es utilizar Homebrew. Si no tienes Homebrew instalado, puedes obtenerlo desde https://brew.sh. Una vez instalado, ejecuta:

brew update
brew install mysql

Después de la instalación, inicia el servicio de MySQL:

brew services start mysql

Puedes configurar la seguridad de tu instalación ejecutando:

mysql_secure_installation

Este comando te permitirá establecer la contraseña del usuario root y ajustar otras configuraciones de seguridad.

En Windows:

Descarga el instalador de MySQL Server desde la página oficial: MySQL :: Download MySQL Community Server y sigue los pasos del asistente de instalación. Configura la contraseña del usuario root cuando se te solicite y anota esta información para uso posterior.

Tras finalizar, puedes optar por instalar MySQL WorkBench para poder visualizar las bases de datos que crees a partir de ahora: MySQL :: Download MySQL Workbench.

Verificación de la instalación:

Para confirmar que MySQL se ha instalado correctamente, intenta conectarte al servidor utilizando el cliente de línea de comandos. Ejecuta:

mysql -u root -p

Introduce la contraseña del usuario root que estableciste durante la instalación. Si la conexión es exitosa, verás el prompt de MySQL, indicando que el servidor está funcionando correctamente.

Creación de una base de datos y usuario específicos:

Es aconsejable crear una base de datos y un usuario dedicados para tu aplicación Flask. Desde el prompt de MySQL, ejecuta:

CREATE DATABASE flaskdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'flaskuser'@'localhost' IDENTIFIED BY 'tupassword';
GRANT ALL PRIVILEGES ON flaskdb.* TO 'flaskuser'@'localhost';
FLUSH PRIVILEGES;

Esto crea una base de datos llamada flaskdb y un usuario flaskuser con acceso únicamente a esta base de datos. Asegúrate de reemplazar 'tupassword' por una contraseña segura.

Configuración de variables de entorno (opcional):

En algunos casos, puede ser necesario añadir el directorio de binarios de MySQL a la variable de entorno PATH para facilitar el acceso a las herramientas de línea de comandos. En Windows, esto se realiza desde las opciones avanzadas del sistema; en macOS y Linux, puedes modificar el archivo ~/.bash_profile o ~/.bashrc.

Problemas comunes:

Servicio de MySQL no iniciado: Si tienes problemas al conectarte, verifica que el servicio de MySQL esté en ejecución. En Linux, puedes iniciarlo con sudo service mysql start.

Permisos de usuario: Asegúrate de que el usuario que has creado tiene los permisos adecuados sobre la base de datos que utilizarás.

La instalación correcta de MySQL es un paso esencial para el desarrollo con Flask y SQLAlchemy. Una vez que el servidor esté en funcionamiento y configurado, podrás proceder a establecer la conexión desde tu aplicación Flask y aprovechar las funcionalidades que ofrece esta potente base de datos relacional.

Qué es SQLAlchemy y qué ventajas tiene frente a no usar ORM en aplicaciones Flask

SQLAlchemy es una biblioteca de Python que proporciona un conjunto completo de herramientas para trabajar con bases de datos relacionales utilizando un enfoque basado en mapeo objeto-relacional (ORM). Esto permite a los desarrolladores interactuar con la base de datos a través de clases y objetos de Python en lugar de escribir consultas SQL manualmente.

SQLAlchemy se compone de dos partes principales:

  • Core SQLAlchemy: Es la parte que proporciona un conjunto de herramientas para emitir consultas y comandos SQL de bajo nivel de manera explícita. Permite construir consultas SQL de forma programática utilizando expresiones de Python.
  • ORM de SQLAlchemy: Es una capa superior que permite mapear tablas de la base de datos a clases de Python. Facilita la manipulación de datos como si fueran objetos, proporcionando una abstracción sobre el lenguaje SQL.

Ventajas de usar SQLAlchemy frente a no usar ORM

  • Abstracción de la base de datos: Al utilizar SQLAlchemy, se consigue una capa de abstracción que permite cambiar de un motor de base de datos a otro con modificaciones mínimas en el código. Esto es especialmente útil si se necesita migrar de MySQL a PostgreSQL u otro sistema.
  • Productividad mejorada: Trabajar con objetos y clases de Python es más intuitivo y eficiente que escribir consultas SQL manualmente. Esto reduce la cantidad de código repetitivo y propenso a errores, acelerando el desarrollo.
  • Seguridad contra inyecciones SQL: Al utilizar parámetros y construcciones proporcionadas por SQLAlchemy, se minimiza el riesgo de vulnerabilidades por inyección SQL, ya que el ORM se encarga de manejar adecuadamente las consultas.
  • Mantenimiento y legibilidad del código: El código escrito con un ORM suele ser más legible y fácil de mantener. Los modelos definen claramente la estructura de los datos, facilitando la comprensión del esquema de la base de datos.
  • Gestión de relaciones y consultas complejas: SQLAlchemy simplifica la definición y manejo de relaciones entre tablas. Permite realizar consultas complejas utilizando métodos de alto nivel sin profundizar en SQL avanzado.
  • Herramientas adicionales y comunidad activa: Al ser una biblioteca ampliamente utilizada, cuenta con extensiones y una comunidad que proporciona soporte y bibliotecas adicionales. Esto incluye herramientas para migraciones, pruebas y optimización de rendimiento.

Ejemplo de modelo con SQLAlchemy

A continuación, se muestra un ejemplo básico de cómo definir un modelo utilizando SQLAlchemy en Flask:

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class Usuario(db.Model):
    __tablename__ = 'usuarios'
    id = db.Column(db.Integer, primary_key=True)
    nombre = db.Column(db.String(50), nullable=False)
    correo = db.Column(db.String(120), unique=True, nullable=False)

    def __repr__(self):
        return f'<Usuario {self.nombre}>'

En este ejemplo, se define la clase Usuario que representa la tabla usuarios en la base de datos. Los atributos de la clase son las columnas de la tabla, y se utilizan tipos de datos proporcionados por SQLAlchemy, como Integer y String.

Comparación con no usar ORM

Sin un ORM, interactuar con la base de datos requiere escribir consultas SQL manualmente, lo que puede llevar a un código más verboso y menos seguro. Por ejemplo, para insertar un nuevo usuario sin usar un ORM:

import pymysql

connection = pymysql.connect(user='user', password='pass', database='flaskdb')
cursor = connection.cursor()
sql = "INSERT INTO usuarios (nombre, correo) VALUES (%s, %s)"
data = ('Ana', 'ana@example.com')
cursor.execute(sql, data)
connection.commit()
cursor.close()
connection.close()

Este enfoque implica más código de manejo de conexiones y gestión manual de consultas, aumentando la complejidad y el riesgo de errores.

Instalación de Flask-SQLAlchemy y configuración de conexión MySQL

Para integrar MySQL en tu aplicación de Flask utilizando SQLAlchemy, es necesario instalar la extensión Flask-SQLAlchemy y configurar adecuadamente la conexión a la base de datos. A continuación, se detallan los pasos para realizar esta integración en un entorno con Python 3.13 y Flask 3.1.0.

Con el entorno virtual activado, instala Flask-SQLAlchemy mediante pip:

pip install Flask-SQLAlchemy

Esta biblioteca proporciona una integración fluida entre Flask y SQLAlchemy, facilitando el uso del ORM en el contexto de una aplicación Flask.

Además, se requiere un driver que permita a SQLAlchemy comunicarse con MySQL. El recomendado es mysqlclient, que puedes instalar con:

pip install mysqlclient

Si encuentras dificultades al instalar mysqlclient debido a dependencias del sistema, puedes optar por PyMySQL como alternativa:

pip install PyMySQL

Es imprescindible indicar a SQLAlchemy cuál driver utilizarás en la cadena de conexión, especialmente si no es el predeterminado.

Una vez instalados los paquetes necesarios, configura la conexión a MySQL en tu aplicación Flask. En tu archivo principal (app.py o el que corresponda), realiza la siguiente configuración:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)

# Configuración de la URI de la base de datos
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://flaskuser:tupassword@localhost/flaskdb'

# Desactivar el seguimiento de modificaciones para mejorar el rendimiento
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db = SQLAlchemy(app)

En la clave SQLALCHEMY_DATABASE_URI, especifica la cadena de conexión con el formato:

mysql://usuario:contraseña@host/base_de_datos

Donde:

  • usuario y contraseña: credenciales de acceso a la base de datos (por ejemplo, flaskuser y tupassword).
  • host: dirección del servidor de base de datos, comúnmente localhost.
  • base_de_datos: nombre de la base de datos que utilizarás (por ejemplo, flaskdb).

Si utilizas PyMySQL, ajusta la cadena de conexión:

app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://flaskuser:tupassword@localhost/flaskdb'

Para comprobar que la configuración es correcta y que la aplicación puede conectarse a MySQL, define un modelo sencillo y crea las tablas correspondientes. Por ejemplo:

class Usuario(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    nombre = db.Column(db.String(50), nullable=False)
    correo = db.Column(db.String(120), unique=True, nullable=False)

    def __repr__(self):
        return f'<Usuario {self.nombre}>'

Luego, inicializa la base de datos y crea las tablas:

if __name__ == '__main__':
    with app.app_context():
        db.create_all()
    app.run(debug=True)

El método create_all() genera las tablas en la base de datos basándose en los modelos definidos. Al ejecutar la aplicación, si las tablas se crean sin errores, significa que la conexión a MySQL se ha establecido correctamente.

Para mejorar la seguridad y mantener buenas prácticas, es aconsejable utilizar variables de entorno para almacenar información sensible como las credenciales de acceso a la base de datos. Puedes modificar la configuración de la siguiente manera:

import os

usuario = os.getenv('DB_USER', 'flaskuser')
contraseña = os.getenv('DB_PASS', 'tupassword')
host = os.getenv('DB_HOST', 'localhost')
nombre_bd = os.getenv('DB_NAME', 'flaskdb')

app.config['SQLALCHEMY_DATABASE_URI'] = f'mysql+mysqlclient://{usuario}:{contraseña}@{host}/{nombre_bd}'

Asegúrate de definir las variables de entorno DB_USER, DB_PASS, DB_HOST y DB_NAME en tu sistema operativo o mediante un archivo .env. Esto evita exponer información sensible en el código fuente.

También es recomendable implementar manejo de excepciones para detectar y gestionar posibles errores al establecer la conexión o durante las operaciones con la base de datos. Esto mejora la robustez de la aplicación y facilita la depuración.

Probar la conexión desde Flask a MySQL

Una vez configurada la conexión entre Flask y MySQL, es fundamental probar que la aplicación puede interactuar correctamente con la base de datos. Para ello, se puede crear una ruta sencilla que realice una operación básica, como insertar un registro o consultar datos existentes.

Primero, asegúrate de tener definido el modelo Usuario tal como se mostró anteriormente:

class Usuario(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    nombre = db.Column(db.String(50), nullable=False)
    correo = db.Column(db.String(120), unique=True, nullable=False)

    def __repr__(self):
        return f'<Usuario {self.nombre}>'

A continuación, añade una ruta en tu aplicación Flask que permita crear un nuevo usuario y guardarlo en la base de datos:

@app.route('/crear_usuario')
def crear_usuario():
    nuevo_usuario = Usuario(nombre='Juan Pérez', correo='juan.perez@example.com')
    try:
        db.session.add(nuevo_usuario)
        db.session.commit()
        return f'Usuario {nuevo_usuario.nombre} creado exitosamente.'
    except Exception as e:
        db.session.rollback()
        return f'Error al crear usuario: {str(e)}'

Esta ruta crear_usuario intenta añadir un nuevo usuario a la tabla usuarios. Si la operación es exitosa, devuelve un mensaje confirmando la creación; si ocurre un error, captura la excepción y revierte la transacción con db.session.rollback().

Para verificar que la conexión y las operaciones funcionan correctamente, inicia la aplicación y accede a esta ruta desde el navegador o utilizando una herramienta como cURL o Postman:

flask run

Luego, en el navegador, visita http://localhost:5000/crear_usuario. Deberías ver el mensaje indicando que el usuario ha sido creado exitosamente. También puedes comprobar en la base de datos que el registro se ha insertado correctamente.

base de datos con usuarios

registrar usuario

Para realizar una consulta y mostrar los usuarios existentes, puedes definir otra ruta:

@app.route('/listar_usuarios')
def listar_usuarios():
    usuarios = Usuario.query.all()
    lista_usuarios = [f'{usuario.nombre} - {usuario.correo}' for usuario in usuarios]
    return '<br>'.join(lista_usuarios)

Esta ruta listar_usuarios recupera todos los registros de la tabla usuarios y genera una lista con el nombre y correo de cada usuario. Luego, muestra esta información en el navegador separando cada usuario con un salto de línea.

usuarios

Accediendo a http://localhost:5000/listar_usuarios, deberías ver una lista de los usuarios almacenados en la base de datos, lo que confirma que la lectura de datos desde MySQL funciona correctamente.

Es importante manejar correctamente las excepciones y errores que puedan surgir durante las operaciones con la base de datos. Por ejemplo, si intentas insertar un usuario con un correo que ya existe, se producirá una violación de la restricción unique. Para capturar este tipo de errores, puedes utilizar bloques try-except más específicos:

from sqlalchemy.exc import IntegrityError

@app.route('/crear_usuario')
def crear_usuario():
    nuevo_usuario = Usuario(nombre='Ana Gómez', correo='juan.perez@example.com')  # Correo duplicado
    try:
        db.session.add(nuevo_usuario)
        db.session.commit()
        return f'Usuario {nuevo_usuario.nombre} creado exitosamente.'
    except IntegrityError:
        db.session.rollback()
        return 'Error: El correo ya está registrado.'
    except Exception as e:
        db.session.rollback()
        return f'Error al crear usuario: {str(e)}'

En este ejemplo, se captura específicamente la excepción IntegrityError para informar sobre la duplicación del correo, lo que mejora la usabilidad y la gestión de errores de la aplicación.

correo registrado

Además, es recomendable habilitar el logging para registrar las operaciones y posibles errores. Puedes configurar el nivel de registro en tu aplicación Flask:

import logging

logging.basicConfig(level=logging.INFO)

Con esta configuración, las operaciones realizadas por SQLAlchemy y los mensajes de error se registrarán en la consola, facilitando el diagnóstico de problemas.

Por último, asegúrate de que la conexión a la base de datos está estable y que las credenciales utilizadas son correctas. Si encuentras errores de conexión, verifica que el servidor de MySQL está en ejecución y que la cadena de conexión en SQLALCHEMY_DATABASE_URI es correcta.

Con estas pruebas y verificaciones, puedes estar seguro de que tu aplicación Flask se está comunicando adecuadamente con MySQL a través de SQLAlchemy, lo que te permite avanzar en el desarrollo de funcionalidades más complejas que involucren operaciones con la base de datos.

Para seguir leyendo hazte Plus

¿Ya eres Plus? Accede a la app

20 % DE DESCUENTO

Plan mensual

19.00 /mes

15.20 € /mes

Precio normal mensual: 19 €
58 % DE DESCUENTO

Plan anual

10.00 /mes

8.00 € /mes

Ahorras 132 € al año
Precio normal anual: 120 €
Aprende Flask GRATIS online

Todas las lecciones de Flask

Accede a todas las lecciones de Flask y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.

Accede GRATIS a Flask y certifícate

En esta lección

Objetivos de aprendizaje de esta lección

  • Instalar MySQL en Linux, macOS y Windows.
  • Verificar instalación mediante línea de comandos MySQL.
  • Crear y configurar bases de datos y usuarios específicos.
  • Configurar entorno y variables para MySQL y Flask.
  • Probar conexión y operaciones básicas con MySQL desde Flask.