EBAC Logotipo
Menú

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.

1. Representa entidades del mundo real con modelos

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:


  1. Definir reglas para cada campo (tipo de dato, longitud, obligatoriedad)
  2. Organizar la información de forma coherente
  3. Facilitar la validación antes de guardar datos
  4. Conectar la lógica de la app con la base de datos


Ejemplo de un modelo simple Tarea:

  1. id: INTEGER PRIMARY KEY — Identificador único
  2. nombre: TEXT(100) — Nombre de la tarea (máx. 100 caracteres)
  3. estado: TEXT(20) — Estado de la tarea (máx. 20 caracteres)

2. Define tus modelos en Flask

Establece convenciones uniformes para tus clases de modelo, asegurando claridad y mantenibilidad.


# ./models/tarea.py

class Tarea:
# Atributos, métodos de tu modelo
@staticmethod
def create(nombre="", id_categoria=None, estado="pendiente")
...

@staticmethod
def update(tarea_id, nombre)
...

@staticmethod
def get_all()
...

@staticmethod
def get_by_id(tarea_id)
...

3. Configura conexión y tablas en SQLite

Define funciones para organizar mejor las llamadas y ejecución de procesos en app/database.py.

import sqlite3

def connect_db():
conn = sqlite3.connect(DATABASE_NAME)
return conn

def 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()

...

4. Centraliza funciones CRUD

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:

  1. create(nombre='',id_categoria_id=None,estado='')
  2. get_all()
  3. get_by_id(tarea_id)
  4. update(tarea_id, nombre='')
  5. delete(tarea_id)


Operaciones adicionales:

  1. set_estado(estado)
  2. 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.

5. Conoce Flask Shell: tu consola interactiva para desarrollo

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 Tarea
from database import connect_db, init_db

6. Crea registros desde Flask Shell

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)

7. Accede a todos las registros de tu tabla

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 Tarea
tareas = Tarea.get_all()
for tarea in tareas:
print(tarea.id, "-", tarea.title, "-", tarea.status, "-", tarea.categoria_id)

8. Realiza una consulta con filtro

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 Tarea
tareas = Tarea.por_estado("completado")
for tarea in tareas:
print(tarea.nombre, "-", tarea.estado, "-", "Categoría ID:", tarea.categoria_id)

9. Obtén registros por relación

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 Tarea
tareas = Tarea.por_categoria(2)
for t in tareas: print(t.id, "-", t.title, "-", t.status, "-", t.categoria_id)

10. Accede a registros por 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 fila
return None

Desde Flask Shell:

from models.tarea import Tarea
tarea = Tarea.get_by_id(3)
if tarea:
print(tarea.title, "-", tarea.status, "-", "Categoría ID:", tarea.categoria_id)
else:
print("Tarea no encontrada")

11. Actualiza registros con UPDATE

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 Tarea

tarea = Tarea.update(3, "Estudiar Python")

12. Elimina registros con cuidado usando DELETE

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 Tarea
Tarea.delete(3)
ADVERTENCIA: esta operación es irreversible. Siempre usa WHERE para evitar eliminar múltiples registros por accidente.

13. Conclusión y Recursos Útiles


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:

  1. Validar la información antes de guardarla.
  2. Mantener la coherencia e integridad de la base de datos.


Recursos recomendados:

  1. Documentación oficial de SQLite
  2. Tutorial: SQLite con Python – Real Python
  3. Repositorios de gestores de tareas en GitHub