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ícateInstalació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.
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.
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.
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.
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.
Introducción A Flask
Introducción Y Entorno
Instalación Y Configuración Flask Con Venv
Introducción Y Entorno
Mysql Con Sqlalchemy En Flask
Modelos Y Migraciones
Tipos De Datos En Modelos
Modelos Y Migraciones
Operaciones Crud Y Consultas
Modelos Y Migraciones
Asociaciones De Modelos
Modelos Y Migraciones
Migraciones Con Flask-migrate
Modelos Y Migraciones
Rutas Endpoints Rest Get
Api Rest
Respuestas Con Esquemas Flask Marshmallow
Api Rest
Rutas Endpoints Rest Post, Put Y Delete
Api Rest
Manejo De Errores Y Códigos De Estado Http
Api Rest
Autenticación Jwt Con Flask-jwt-extended
Api Rest
Controlador Mvc Con Métodos Get En Flask
Mvc
Sintaxis De Plantillas Jinja 2 En Flask
Mvc
Controlador Mvc Con Métodos Post En Flask
Mvc
Inclusión De Archivos Estáticos En Jinja
Mvc
Validación De Formularios Con Wtforms
Mvc
Subir Archivos En Formularios Jinja En Flask
Mvc
Autenticación Con Flask-login
Mvc
Autorización Con Flask-principal
Mvc
Qué Son Los Blueprints Y Cómo Crear Uno
Blueprints
Integrar Openai Api En Flask Api Rest
Aplicación Con Ia
Sqlalchemy Orm En Flask Mysql
Aplicación Con Ia
Resultados De Ia Con Jinja En Flask
Aplicación Con Ia
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.