7.5 Creación de modelos e integración de SQLite
Aprenderás a representar tu tabla de tareas como un modelo en Python, para poder guardar, buscar, actualizar, validar y eliminar registros desde el código.
Aprenderás a representar tu tabla de tareas como un modelo en Python, para poder guardar, buscar, actualizar, validar y eliminar registros desde el código.
Un modelo es una representación estructurada de una entidad del mundo real.
Nos permiten estructurar los datos que una aplicación necesita, estableciendo reglas claras para organizarlos y validarlos. Su propósito es:
Ejemplo de un modelo simple Tarea:
id: INTEGER PRIMARY KEY — Identificador úniconombre: TEXT(100) — Nombre de la tarea (máx. 100 caracteres)estado: TEXT(20) — Estado de la tarea (máx. 20 caracteres)Establece convenciones uniformes para tus clases de modelo, asegurando claridad y mantenibilidad.
# ./models/tarea.pyclass Tarea:# Atributos, métodos de tu modelo@staticmethoddef create(nombre="", id_categoria=None, estado="pendiente")...@staticmethoddef update(tarea_id, nombre)...@staticmethoddef get_all()...@staticmethoddef get_by_id(tarea_id)...
Define funciones para organizar mejor las llamadas y ejecución de procesos en app/database.py.
import sqlite3def connect_db():conn = sqlite3.connect(DATABASE_NAME)return conndef init_db():conn = connect_db()create_table_categorias(conn)create_table_tareas(conn)create_indices(conn)conn.close()def create_table_categorias(conn):conn.execute("""CREATE TABLE IF NOT EXISTS categorias (id INTEGER PRIMARY KEY AUTOINCREMENT,nombre TEXT NOT NULL UNIQUE)""")conn.commit()...
Definir funciones CRUD en database.py permite separar la lógica de datos del resto de la aplicación. Esto mejora la organización del código, facilita trabajar desde Flask Shell o las vistas sin duplicar código.
Funciones clave CRUD- Ejemplo para Tarea:
create(nombre='',id_categoria_id=None,estado='')
get_all()
get_by_id(tarea_id)
update(tarea_id, nombre='')
delete(tarea_id)
Operaciones adicionales:
set_estado(estado)
por_categoria(categoria_id)
Cada una encapsula una operación esencial sobre la tabla tareas, haciendo que el código sea más fácil de leer, depurar y escalar conforme tu aplicación crece.
Flask Shell es una consola interactiva que te da acceso directo a tu app, tus modelos y tu base de datos.
Accede mediante el comando: flask shell
Puedes acceder a tus módelos desde esta terminal importándolos mediante:
from models.tarea import Tareafrom database import connect_db, init_db
Primero, define la función en tu modelo models/tarea.py:
def create(nombre="", id_categoria=None, estado="pendiente"):conn = get_connection()cursor = conn.execute("INSERT INTO tareas (nombre, estado, categoria_id) VALUES (?, ?, ?)",(nombre, estado, categoria_id))conn.commit()return cursor.lastrowid
Luego, en Flask Shell:
>>> from app.models import Categoria, Tarea# 1. Crear una categoría>>> categoria_id = Categoria.create(name="Aprendizaje")>>> print("Categoría registrada con ID:", categoria_id)# 2. Crear una tarea vinculada>>> tarea = Tarea.create(nombre="Estudiar", estado="pendiente", categoria_id=categoria_id)>>> print("Tarea registrada con ID:", tarea)
Define en models/tarea.py:
def get_all():conn = get_connection()cursor = conn.execute("SELECT id, nombre, estado, categoria_id FROM tareas")filas = cursor.fetchall()conn.close()return filas
Desde Flask Shell:
from models.tarea import Tareatareas = Tarea.get_all()for tarea in tareas:print(tarea.id, "-", tarea.title, "-", tarea.status, "-", tarea.categoria_id)
Define tu función en models/tarea.py:
def get_por_estado(estado='pendiente'):conn = get_connection()cursor = conn.execute("SELECT id, nombre, estado, categoria_id FROM tareas WHERE estado = ?", (status,))registros = cursor.fetchall()conn.close()return registros
Luego en Flask Shell:
from models.tarea import Tareatareas = Tarea.por_estado("completado")for tarea in tareas:print(tarea.nombre, "-", tarea.estado, "-", "Categoría ID:", tarea.categoria_id)
Define tu función en models/tarea.py:
def get_por_categoria(categoria_id):conn = get_connection()cursor = conn.execute("SELECT id, nombre, estado, categoria_id FROM tareas WHERE categoria_id = ?", (categoria_id,))filas = cursor.fetchall()conn.close()return filas
Luego, en Flask Shell:
from models.tarea import Tareatareas = Tarea.por_categoria(2)for t in tareas: print(t.id, "-", t.title, "-", t.status, "-", t.categoria_id)
Define en models/tarea.py:
def get_by_id(tarea_id):conn = get_connection()cursor = conn.execute("SELECT id, nombre, estado, categoria_id FROM tareas WHERE id = ?", (tarea_id,))fila = cursor.fetchone()conn.close()if fila:return filareturn None
Desde Flask Shell:
from models.tarea import Tareatarea = Tarea.get_by_id(3)if tarea:print(tarea.title, "-", tarea.status, "-", "Categoría ID:", tarea.categoria_id)else:print("Tarea no encontrada")
Define tu función en models/tarea.py:
def update(tarea_id, nuevo_nombre):conn = get_connection()conn.execute("UPDATE tareas SET nombre = ?, WHERE id = ?", (nuevo_nombre, tarea_id))conn.commit()conn.close()
Luego, en Flask Shell:
from models.tarea import Tareatarea = Tarea.update(3, "Estudiar Python")
Define tu función en models/tarea.py:
def delete(tarea_id):conn = get_connection()conn.execute("DELETE FROM tareas WHERE id = ?", (tarea_id,))conn.commit()
Desde Flask Shell:
from models.tarea import TareaTarea.delete(3)
ADVERTENCIA: esta operación es irreversible. Siempre usa WHERE para evitar eliminar múltiples registros por accidente.
Ahora que sabes cómo representar entidades reales mediante modelos estructurados en Python, e integrarlos con SQLite y Flask Shell, puedes almacenar, consultar y modificar datos de forma segura desde un entorno interactivo.
Recuerda siempre:
Recursos recomendados: