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!', 404
Eliminar (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!', 404
Ejercicio Práctico
Ejercicio 1: Crear una Nueva Tarea
- Crea una ruta
/add_task
que 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
/tasks
que 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!', 404
Solució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!', 404
Conclusió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