SQLite y CRUD en Python: persistencia local con integridad y seguridad

Aprende a modelar tablas, ejecutar operaciones CRUD y usar SQL parametrizado para evitar inyecciones y errores de consistencia.

SQLite es una base de datos embebida en archivo, ideal para prototipos, herramientas internas y aplicaciones ligeras.

CRUD significa Create, Read, Update, Delete: las cuatro operaciones base de persistencia.

Usar consultas parametrizadas (`?`) evita inyecciones SQL y separa lógica de consulta de datos de usuario.

Las transacciones (`commit`/`rollback`) son clave para mantener integridad cuando hay varios cambios dependientes.

  • Define tabla y claves correctamente antes de insertar datos.
  • Una tabla con `PRIMARY KEY` garantiza identificador único y facilita operaciones posteriores.
  • `sqlite3.connect('app.db')` crea/abre archivo de base de datos; para pruebas rápidas puedes usar `:memory:`.
  • Mantén SQL de inicialización en funciones claras para que el proyecto sea reproducible.
  • Nunca interpolar datos con f-strings en SQL de entrada de usuario.

1) Diseño mínimo de esquema y conexión

Define tabla y claves correctamente antes de insertar datos.

Una tabla con `PRIMARY KEY` garantiza identificador único y facilita operaciones posteriores.

`sqlite3.connect('app.db')` crea/abre archivo de base de datos; para pruebas rápidas puedes usar `:memory:`.

Mantén SQL de inicialización en funciones claras para que el proyecto sea reproducible.

2) Operaciones CRUD con parámetros

Nunca interpolar datos con f-strings en SQL de entrada de usuario.

Create: `INSERT` para añadir registros. Read: `SELECT` para consultar. Update y Delete para modificación/eliminación controladas.

En SQLite con Python, usa placeholders `?` y pasa tupla de parámetros.

Este patrón evita vulnerabilidades y también errores por comillas/escapes.

3) Transacciones y manejo de errores

Si una operación compuesta falla, revierte para no dejar datos inconsistentes.

Agrupa operaciones relacionadas en una transacción y confirma solo al final si todo fue bien.

Ante excepción, usa `rollback()` para volver al estado previo y conservar integridad.

Registra el error con contexto para facilitar diagnóstico.

  • Usa `?` para parámetros siempre.
  • Haz commit explícito tras cambios.
  • Rollback en error de operación compuesta.
  • Cierra conexión al terminar.
Python
20

SQLite y CRUD en Python: persistencia local con integridad y seguridad

Aprende a modelar tablas, ejecutar operaciones CRUD y usar SQL parametrizado para evitar inyecciones y errores de consistencia.

Código del tema: SELECT * FROM items WHERE activo = 1;

📘 Teoría

1) Diseño mínimo de esquema y conexión

Define tabla y claves correctamente antes de insertar datos.

1

Una tabla con `PRIMARY KEY` garantiza identificador único y facilita operaciones posteriores.

2

`sqlite3.connect('app.db')` crea/abre archivo de base de datos; para pruebas rápidas puedes usar `:memory:`.

3

Mantén SQL de inicialización en funciones claras para que el proyecto sea reproducible.

Crear tabla tareas
import sqlite3

conn = sqlite3.connect('app.db')
cur = conn.cursor()

cur.execute('''
CREATE TABLE IF NOT EXISTS tareas (
    id INTEGER PRIMARY KEY,
    titulo TEXT NOT NULL,
    completada INTEGER NOT NULL DEFAULT 0
)
''')

conn.commit()
conn.close()

2) Operaciones CRUD con parámetros

Nunca interpolar datos con f-strings en SQL de entrada de usuario.

Create: `INSERT` para añadir registros. Read: `SELECT` para consultar. Update y Delete para modificación/eliminación controladas.

En SQLite con Python, usa placeholders `?` y pasa tupla de parámetros.

Este patrón evita vulnerabilidades y también errores por comillas/escapes.

1

Insert y Select

Crear y leer datos de forma segura.

2

Update y Delete

Modificar o eliminar por ID.

3) Transacciones y manejo de errores

Si una operación compuesta falla, revierte para no dejar datos inconsistentes.

Agrupa operaciones relacionadas en una transacción y confirma solo al final si todo fue bien.

Ante excepción, usa `rollback()` para volver al estado previo y conservar integridad.

Registra el error con contexto para facilitar diagnóstico.

  • Usa `?` para parámetros siempre.
  • Haz commit explícito tras cambios.
  • Rollback en error de operación compuesta.
  • Cierra conexión al terminar.
Transacción defensiva
try:
    cur.execute('INSERT INTO tareas(titulo) VALUES (?)', ('A',))
    cur.execute('INSERT INTO tareas(titulo) VALUES (?)', ('B',))
    conn.commit()
except sqlite3.Error:
    conn.rollback()
    raise

🧪 Aprende probando

Ejemplo Ejemplo: mini repositorio de tareas Función de creación y consulta para separar persistencia de lógica de negocio.

🏁 Retos

Reto Reto: define sentencia de creación de tabla Escribe SQL para crear `usuarios` con id y nombre.

🧰 Recursos

Test

Comprueba tus conocimientos con un test sobre Python.

Test de Python

¿Qué es esto?

Soy Cristian Eslava y a veces hago webs para procrastinar yo y vosotros 😉.

Esta la hice en febrero de 2026 para facilitar el aprendizaje de mis alumnxs. Aprender desarrollo web practicando. La idea es que crezca semanalmente con nuevos temas, tests y retos.

Inspirado en MDN, en W3Schools, en Codepen, en el crack de Manz y en mil sitios de documentación sobre desarrollo web. Quería aportar además de bloques teóricos con ejemplos, la gamificación de los retos y el sistema de test que ya tenía en culTest .

Si te gustó, si no te gustó, si quieres saludarme, o invitarme a 🍻 no dudes en escribirme en cristianeslava@gmail.com .