En este tema, aprenderemos a realizar operaciones CRUD (Crear, Leer, Actualizar y Eliminar) utilizando Flask-SQLAlchemy. Estas operaciones son fundamentales para cualquier aplicación que maneje datos almacenados en una base de datos.
Conceptos Clave
- Crear (Create): Insertar nuevos registros en la base de datos.
- Leer (Read): Recuperar datos de la base de datos.
- Actualizar (Update): Modificar registros existentes en la base de datos.
- Eliminar (Delete): Borrar registros de la base de datos.
Configuración Inicial
Antes de comenzar, asegúrate de tener Flask y Flask-SQLAlchemy instalados. Puedes instalarlos usando pip:
Definiendo el Modelo
Primero, definimos un modelo de base de datos. Supongamos que estamos creando una aplicación para gestionar una lista de tareas.
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///tasks.db'
db = SQLAlchemy(app)
class Task(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(80), nullable=False)
description = db.Column(db.String(200), nullable=True)
done = db.Column(db.Boolean, default=False)
def __repr__(self):
return f'<Task {self.title}>'
# Crear la base de datos y las tablas
with app.app_context():
db.create_all()Crear (Create)
Para crear un nuevo registro en la base de datos, instanciamos el modelo y lo añadimos a la sesión de la base de datos.
@app.route('/add_task', methods=['POST'])
def add_task():
title = request.form['title']
description = request.form.get('description')
new_task = Task(title=title, description=description)
db.session.add(new_task)
db.session.commit()
return 'Task added successfully!'Leer (Read)
Para leer datos de la base de datos, utilizamos consultas de SQLAlchemy.
@app.route('/tasks', methods=['GET'])
def get_tasks():
tasks = Task.query.all()
tasks_list = [{'id': task.id, 'title': task.title, 'description': task.description, 'done': task.done} for task in tasks]
return jsonify(tasks_list)Actualizar (Update)
Para actualizar un registro existente, primero lo recuperamos, luego modificamos sus atributos y finalmente confirmamos los cambios.
@app.route('/update_task/<int:task_id>', methods=['PUT'])
def update_task(task_id):
task = Task.query.get(task_id)
if task:
task.title = request.form['title']
task.description = request.form.get('description')
task.done = request.form.get('done', type=bool)
db.session.commit()
return 'Task updated successfully!'
else:
return 'Task not found!', 404Eliminar (Delete)
Para eliminar un registro, lo recuperamos y luego lo eliminamos de la sesión de la base de datos.
@app.route('/delete_task/<int:task_id>', methods=['DELETE'])
def delete_task(task_id):
task = Task.query.get(task_id)
if task:
db.session.delete(task)
db.session.commit()
return 'Task deleted successfully!'
else:
return 'Task not found!', 404Ejercicio Práctico
Ejercicio 1: Crear una Nueva Tarea
- Crea una ruta
/add_taskque acepte datos de un formulario y añada una nueva tarea a la base de datos. - Asegúrate de manejar los casos en los que el título de la tarea no esté presente.
Ejercicio 2: Listar Todas las Tareas
- Crea una ruta
/tasksque devuelva una lista de todas las tareas en formato JSON. - Asegúrate de incluir todos los campos de cada tarea en la respuesta JSON.
Ejercicio 3: Actualizar una Tarea
- Crea una ruta
/update_task/<int:task_id>que acepte datos de un formulario y actualice la tarea correspondiente. - Asegúrate de manejar los casos en los que la tarea no exista.
Ejercicio 4: Eliminar una Tarea
- Crea una ruta
/delete_task/<int:task_id>que elimine la tarea correspondiente. - Asegúrate de manejar los casos en los que la tarea no exista.
Soluciones
Solución al Ejercicio 1
@app.route('/add_task', methods=['POST'])
def add_task():
title = request.form.get('title')
if not title:
return 'Title is required!', 400
description = request.form.get('description')
new_task = Task(title=title, description=description)
db.session.add(new_task)
db.session.commit()
return 'Task added successfully!'Solución al Ejercicio 2
@app.route('/tasks', methods=['GET'])
def get_tasks():
tasks = Task.query.all()
tasks_list = [{'id': task.id, 'title': task.title, 'description': task.description, 'done': task.done} for task in tasks]
return jsonify(tasks_list)Solución al Ejercicio 3
@app.route('/update_task/<int:task_id>', methods=['PUT'])
def update_task(task_id):
task = Task.query.get(task_id)
if task:
task.title = request.form.get('title', task.title)
task.description = request.form.get('description', task.description)
task.done = request.form.get('done', type=bool, default=task.done)
db.session.commit()
return 'Task updated successfully!'
else:
return 'Task not found!', 404Solución al Ejercicio 4
@app.route('/delete_task/<int:task_id>', methods=['DELETE'])
def delete_task(task_id):
task = Task.query.get(task_id)
if task:
db.session.delete(task)
db.session.commit()
return 'Task deleted successfully!'
else:
return 'Task not found!', 404Conclusión
En esta sección, hemos aprendido a realizar operaciones CRUD utilizando Flask-SQLAlchemy. Estas operaciones son esenciales para cualquier aplicación que maneje datos. Asegúrate de practicar estos conceptos creando y manipulando tus propios modelos y rutas. En el próximo módulo, exploraremos cómo manejar la autenticación de usuarios en Flask.
Curso de Desarrollo Web con Flask
Módulo 1: Introducción a Flask
- ¿Qué es Flask?
- Configuración de tu Entorno de Desarrollo
- Creando tu Primera Aplicación Flask
- Entendiendo la Estructura de una Aplicación Flask
Módulo 2: Conceptos Básicos de Flask
- Enrutamiento y Mapeo de URLs
- Manejo de Métodos HTTP
- Renderizando Plantillas con Jinja2
- Trabajando con Archivos Estáticos
Módulo 3: Formularios y Entrada de Usuario
Módulo 4: Integración de Bases de Datos
- Introducción a Flask-SQLAlchemy
- Definiendo Modelos
- Realizando Operaciones CRUD
- Migraciones de Base de Datos con Flask-Migrate
Módulo 5: Autenticación de Usuarios
- Registro de Usuarios
- Inicio y Cierre de Sesión de Usuarios
- Hashing de Contraseñas
- Gestión de Sesiones de Usuario
Módulo 6: Conceptos Avanzados de Flask
- Blueprints para Aplicaciones Grandes
- Manejo de Errores
- Páginas de Error Personalizadas
- Registro y Depuración
Módulo 7: APIs RESTful con Flask
- Introducción a las APIs RESTful
- Creación de Endpoints RESTful
- Manejo de Datos JSON
- Autenticación para APIs
Módulo 8: Despliegue y Producción
- Configuración de Flask para Producción
- Despliegue en Heroku
- Despliegue en AWS
- Monitoreo y Optimización del Rendimiento
Módulo 9: Pruebas y Mejores Prácticas
- Pruebas Unitarias con Flask
- Pruebas de Integración
- Cobertura de Pruebas
- Mejores Prácticas para el Desarrollo con Flask
