Guardar datos solo resulta útil si puedes recuperarlos con claridad. En esta lección añadirás la consulta al módulo almacen.py. Obtendrás objetos Articulo y aplicarás una búsqueda por código o nombre que respeta las decisiones del curso sobre mayúsculas y tildes. Separaremos la recuperación de registros de su presentación en la terminal.
Consultar columnas conocidas
SELECT permite indicar qué columnas quieres recuperar. Es preferible enumerarlas en lugar de depender de SELECT *: así el orden y la intención permanecen visibles si amplías la tabla. ORDER BY define el orden de salida. Sin esa cláusula no deberías construir expectativas sobre el orden en que aparecerán los registros.
En nuestro caso consultaremos codigo, nombre y cantidad ordenados por código. Cada fila devuelta por sqlite3 será una tupla con esos tres valores. Utilizaremos el constructor Articulo porque los datos proceden de la tabla creada por nuestra aplicación. Esto presupone que no has modificado su contenido por herramientas externas saltándote las reglas del modelo.
Completar almacen.py
Añade la importación al comienzo del archivo y la función al final. No sustituyas conectar ni agregar_varios. Este bloque completa el almacenamiento que utilizarán las siguientes lecciones. La consulta devuelve una lista y no imprime mensajes ni cierra la conexión recibida.
def consultar(conexion, texto=""): filas = conexion.execute( "SELECT codigo, nombre, cantidad FROM articulos ORDER BY codigo" ).fetchall() consulta = texto.strip().casefold() articulos = [Articulo(*fila) for fila in filas] return [ a for a in articulos if consulta in a.codigo.casefold() or consulta in a.nombre.casefold() ] «`
El asterisco de Articulo(*fila) distribuye los tres valores como argumentos. Su orden debe coincidir con el constructor. Esta es otra razón para enumerar columnas explícitamente. Si cambias el SELECT sin cambiar esa correspondencia podrías asignar un nombre al código o una cantidad al campo equivocado.
Por qué filtramos en Python
SQLite dispone de condiciones WHERE y operadores de búsqueda. Sin embargo, sus reglas incorporadas para comparaciones de texto no equivalen siempre a casefold de Python para todo Unicode. En este curso queremos una semántica sencilla y coherente con la lección de textos. Por eso recuperamos los registros del pequeño inventario y filtramos sus nombres en Python.
Esta elección tiene un coste: se cargan todos los artículos antes de filtrar. Es aceptable para el alcance educativo y los archivos pequeños previstos. No sería una solución adecuada sin revisión para un catálogo enorme. Si crece el volumen estudiarás índices, paginación y una estrategia de búsqueda en la base que mantenga las reglas lingüísticas deseadas.
Distinguir búsqueda parcial y coincidencia exacta
Una búsqueda parcial con «CU» puede encontrar el código CU001 y el nombre Cuaderno. No está identificando necesariamente un solo artículo. Si necesitas modificar un registro debes utilizar su código exacto y comprobar que existe. No conviertas el primer resultado de una búsqueda aproximada en un destino de actualización sin confirmación.
Una consulta vacía devuelve todos los artículos porque la cadena vacía aparece dentro de cualquier texto. Esa conducta estaba definida desde el capítulo inicial. El strip de la consulta hace que una entrada formada solo por espacios se comporte igual. El nombre almacenado se conserva tal como fue aceptado; solo transformamos copias temporales para comparar.
Tildes y mayúsculas no son lo mismo
Buscar «LÁPIZ» encontrará «Lápiz». Buscar «lapiz» no tiene por qué encontrarlo porque casefold no elimina la tilde. Esa diferencia debe estar explicada en las instrucciones de la aplicación. No añadas una normalización que quite acentos sin decidir cómo afectará a nombres que se distinguen por ellos.
Para búsquedas exactas por código podrías usar SELECT con WHERE codigo = ? y pasar el valor como parámetro. Es una operación diferente y una posible ampliación. La primera versión solo necesita listar y buscar parcialmente. Mantener el alcance te permite terminar y comprobar el programa antes de introducir más comandos.
Presentar una lista vacía
Una consulta correcta puede devolver cero resultados. No es una excepción ni significa que se haya perdido la base. La interfaz mostrará «No hay artículos que mostrar». En cambio, una tabla inexistente o un archivo dañado deben producir un error de almacenamiento. No captures esos problemas para devolver una lista vacía porque estarías confundiendo situaciones importantes.
Al mostrar registros separaremos código, nombre y cantidad. Los nombres tienen una longitud limitada y no contienen caracteres de control, lo que reduce sorpresas en la terminal. No necesitamos dibujar una tabla rígida con anchuras enormes. Una línea por artículo será suficiente y el formato CSV resolverá el intercambio con otras herramientas.
Errores habituales
Concatenar una búsqueda dentro del SQL puede romper la consulta con comillas y abrir problemas de inyección. Aunque este ejemplo filtra en Python mantén el hábito de parámetros cuando uses WHERE. Otro fallo es asumir que fetchall devuelve objetos Articulo directamente. La conversión debe ser explícita y respetar el orden de columnas.
También puedes confundir el número de resultados con las unidades disponibles. Tres filas no significan tres unidades. Si más adelante añades estadísticas nombra por separado el recuento de artículos y la suma de cantidades. Las consultas deben responder una pregunta concreta y su presentación debe conservar ese significado.
Lo que deberías recordar
- Define el orden con ORDER BY.
- La búsqueda parcial puede devolver varios artículos.
- casefold no elimina tildes.
- Una lista vacía no debe ocultar un fallo de almacenamiento.
Ejercicio práctico
Prepara una base en memoria con Cuaderno, Lápiz y Carpeta. Utiliza códigos que no estén insertados en orden alfabético. Llama a consultar sin texto y comprueba que el resultado aparece ordenado por código, no por el orden de inserción.
Busca «CUAD», «LÁPIZ», «lapiz» y una palabra que no exista. Anota las coincidencias y explica qué resultados dependen de casefold y cuáles de conservar tildes. Repite con una consulta formada solo por espacios y verifica que aparecen todos los artículos.
Añade una prueba automática para la búsqueda sin resultados. Debe esperar una lista vacía sin excepción. Después intenta consultar una conexión cerrada y observa que eso sí es un error. En el cuaderno explica por qué no deberías convertir ambos casos en el mismo mensaje ni ocultar un problema de conexión como si no hubiera artículos.
Siguiente: Utilizar argumentos desde la terminal.








