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

  1. Crear (Create): Insertar nuevos registros en la base de datos.
  2. Leer (Read): Recuperar datos de la base de datos.
  3. Actualizar (Update): Modificar registros existentes en la base de datos.
  4. 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:

pip install Flask Flask-SQLAlchemy

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

  1. Crea una ruta /add_task que acepte datos de un formulario y añada una nueva tarea a la base de datos.
  2. Asegúrate de manejar los casos en los que el título de la tarea no esté presente.

Ejercicio 2: Listar Todas las Tareas

  1. Crea una ruta /tasks que devuelva una lista de todas las tareas en formato JSON.
  2. Asegúrate de incluir todos los campos de cada tarea en la respuesta JSON.

Ejercicio 3: Actualizar una Tarea

  1. Crea una ruta /update_task/<int:task_id> que acepte datos de un formulario y actualice la tarea correspondiente.
  2. Asegúrate de manejar los casos en los que la tarea no exista.

Ejercicio 4: Eliminar una Tarea

  1. Crea una ruta /delete_task/<int:task_id> que elimine la tarea correspondiente.
  2. 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

Módulo 2: Conceptos Básicos de Flask

Módulo 3: Formularios y Entrada de Usuario

Módulo 4: Integración de Bases de Datos

Módulo 5: Autenticación de Usuarios

Módulo 6: Conceptos Avanzados de Flask

Módulo 7: APIs RESTful con Flask

Módulo 8: Despliegue y Producción

Módulo 9: Pruebas y Mejores Prácticas

Módulo 10: Extensiones y Ecosistema de Flask

© Copyright 2024. Todos los derechos reservados