Estado SQLite
Usa esta habilidad cuando un trabajo recurrente deba recordar lo que ya hizo — qué elementos ha alertado, el último cursor que procesó — para que no re-notifique o re-scrapee en el próximo tick. Un solo archivo SQLite estándar proporciona estado duradero con bloqueo de archivo, sin servidor y sin dependencias adicionales.
Cuándo invocar
- El usuario dice: "no alertes lo mismo dos veces", "deduplica entre ejecuciones", "recuerda el último id", "reanuda donde lo dejaste".
- El código en la conversación es un script programado (cron) que actualmente reprocesa todo en cada ejecución.
Cuándo NO invocar
- El estado es pequeño y efímero dentro de una sola ejecución — un simple conjunto/diccionario es suficiente.
- Múltiples máquinas deben compartir estado concurrentemente; recurre a una base de datos real con servidor en lugar de un solo archivo.
Ejemplo concreto
Entrada del usuario:
Mi scraper de noticias reenvía los mismos titulares cada hora. Haz que solo envíe los nuevos.
Salida:
from state import filter_new, mark_seen
db = "news.db"
fresh = filter_new(db, [a["url"] for a in articles]) # solo URLs no vistas
for url in fresh:
send_alert(url)
mark_seen(db, *fresh) # recuérdalos para la próxima ejecución
Patrón a aplicar
- Clave cada elemento por algo estable y único (URL, id, hash de contenido), no por posición en un arreglo.
- Usa
filter_newpara decidir sobre qué actuar, luegomark_seensolo después de que la acción tenga éxito. - Almacena el progreso como un cursor con nombre (
set_cursor/get_cursor) para que un scraper reanudable se reinicie a medio camino. - Habilita el modo WAL para escrituras duraderas con lectores concurrentes; mantén un solo escritor.
- Respaldar o versionar el único archivo
.db— es toda la memoria del trabajo.
Referencia: assets/state.py.
Fuente
Destilado del uso en producción en los proyectos de automatización del autor. v1.0.0. Ver también: [[pipeline-orchestrator]], [[cron-dispatch]], [[webhook-receiver]].
→ Construye el bot ejecutable completo con Trawlkit.