Código Python: SQLite desde cero (crear, insertar, consultar, actualizar, borrar)

Código Python: SQLite desde cero (crear, insertar, consultar, actualizar, borrar)
Cuando el inventario vive repartido en archivos sueltos —una hoja por mes, una copia en el computador del mostrador y otra en el correo del contador— el problema de fondo no es la tecnología: es que nadie puede responder una pregunta sencilla con confianza. Cuánto vale hoy el depósito. A qué precio se vendió el taladro la semana pasada. Cuántas cintas aislantes quedan de verdad. Cada copia tiene su propia respuesta y ninguna manda sobre las demás. Este programa muestra, en siete pasos que se ven en pantalla, cómo ese mismo inventario se guarda en una base de datos SQLite: un solo archivo, con una sola versión de la verdad, donde un precio se corrige en un único lugar y el total sale solo. Está escrito para el dueño de un negocio pequeño, para el contador que recibe cajas de comprobantes y para el almacenista que cuenta y anota; no hace falta saber programar para seguir lo que va pasando.
No se instala ningún motor de base de datos, no se paga licencia y no hace falta internet. Python trae SQLite dentro y este ZIP trae todo lo demás.
⬇ Descargar el código (ZIP)Qué trae el ZIP
| Archivo del paquete | Para qué sirve |
|---|---|
sqlite_desde_cero.py | El programa completo, comentado línea por línea en español, con los siete pasos. |
datos/productos.csv | Ocho productos de ejemplo, con código, nombre, categoría, precio y existencias. |
salida_ejemplo.txt | La salida real del programa, para compararla con lo que le salga a usted. |
LEEME.md | Las instrucciones de instalación y de ejecución, en dos minutos de lectura. |
Qué gana el negocio al guardar en una base y no en archivos sueltos
Una hoja de cálculo es una foto: sirve para lo que se ve en la foto y nada más. Una base de datos es un archivo vivo donde cada producto existe una sola vez y donde las reglas se cumplen siempre. Fíjese en lo que cambia en el día a día. Primero, deja de haber copias rivales: el precio del cable es uno, no el que recuerda el vendedor. Segundo, el archivo impide datos imposibles: el programa define el código como llave, así que no pueden existir dos productos con el mismo código, por más que dos personas trabajen al mismo tiempo. Tercero, corregir un precio no obliga a recalcular nada a mano, porque el valor de cada línea se obtiene multiplicando en el momento de la consulta. Y cuarto, el total del inventario y los subtotales por categoría son una pregunta, no una fórmula que alguien pegó en la columna de al lado y que se rompe cuando se inserta una fila.
Hay además una ventaja que se nota el día del problema: la base se corrige dentro de un bloque que se confirma o se deshace completo. Si el programa falla a mitad de la carga, no queda medio inventario cargado: o entró todo o no entró nada. En una hoja de cálculo, un corte de luz a mitad del pegado deja un archivo que nadie sabe si está bien.
Qué hace el programa
- Crea la base y la tabla de productos con sus tipos, la primera vez que se ejecuta.
- Lee los ocho productos del archivo de ejemplo y los inserta uno por uno con una consulta con parámetros.
- Consulta la tabla completa ordenada por código y arma la lista con el valor de cada línea.
- Actualiza el precio del cable y muestra el precio de antes y el de después.
- Borra la cinta aislante y confirma cuántos productos quedan en la tabla.
- Calcula el valor del inventario por categoría y comprueba que la suma de las categorías coincida con el total.
- Cierra la conexión y confirma: si algún paso hubiera fallado, la base habría quedado como estaba.
Cómo ejecutarlo
Instale Python 3.11 o superior desde el sitio oficial y marque la casilla que agrega Python al sistema. Descomprima el ZIP en una carpeta cómoda, abra la terminal en esa carpeta y escriba python sqlite_desde_cero.py. No hay que instalar nada más: la base de datos viene dentro de Python y todas las demás herramientas son de la biblioteca estándar. Si el comando python no responde, pruebe con py sqlite_desde_cero.py.
El código, explicado
El programa cabe en una pantalla y media y se lee de arriba abajo. Estos son los cinco pedazos que conviene entender, porque son los que se repiten después en cualquier automatización de inventario.
Uno: de dónde salen las herramientas. Cuatro importaciones y nada más. La segunda es la que importa para el negocio, porque significa que la base de datos ya viene con Python y el respaldo del inventario es un archivo que se copia como se copia una foto.
import csv # csv: lee los productos de ejemplo desde un archivo de texto
import sqlite3 # sqlite3: la base de datos viene dentro de Python, no hay que instalar nada
from decimal import Decimal, ROUND_HALF_UP # Decimal: el dinero no se calcula con decimales binarios (float)
from pathlib import Path # pathlib: rutas que funcionan en Windows, Linux y Mac
Dos: la base se abre dentro de un contrato. El bloque with abre la conexión y, al salir, confirma los cambios pendientes. Si algo revienta en el camino, deshace todo y deja el archivo como estaba. Para el dueño, esto es la diferencia entre un inventario confiable y un inventario a medias.
# with sqlite3.connect(...): abre la base y, al salir del bloque, confirma los cambios
with sqlite3.connect(RUTA_DB) as conexion:
cursor = conexion.cursor()
Tres: los datos entran marcados con signos de pregunta. Aquí está la decisión más importante del programa y casi nunca se explica en los tutoriales. El texto de la consulta se escribe una sola vez, con un signo de pregunta por cada dato que va a entrar; los valores viajan aparte, como una lista ordenada. Nunca se arma la consulta pegando texto. La razón de negocio es sencilla: el nombre de un proveedor, la referencia de un producto o la nota de una factura pueden traer comillas o cualquier otro signo, y si ese texto se pegara dentro de la consulta, el motor lo leería como una orden y no como un dato. Con los parámetros, el motor sabe siempre qué es la orden y qué es el dato, y además la misma consulta se ejecuta muchas veces sin volver a analizarla, que es justo lo que se necesita al cargar cientos de referencias.
sql_insert = ("INSERT INTO productos (codigo, producto, categoria, precio, "
"existencias) VALUES (?, ?, ?, ?, ?)")
mostrar_sql(sql_insert)
for producto in productos:
cursor.execute(sql_insert, (
producto["codigo"], producto["producto"],
producto["categoria"], int(producto["precio"]),
int(producto["existencias"]),
))
Cuatro: el programa muestra el SQL que va a ejecutar. Esta función parece un detalle de adorno y es la mitad del aprendizaje: en la pantalla se lee la orden en el idioma de las bases de datos, justo antes de que se ejecute. Al terminar la lectura usted ya reconoce las cinco órdenes del oficio, que son las mismas de cualquier sistema de inventario serio.
def mostrar_sql(sql: str) -> None:
"""Muestra la sentencia SQL que se va a ejecutar: ver el SQL es medio aprendizaje."""
print(f"SQL: {sql}")
Cinco: la pregunta de negocio, en una línea. Contar los productos y sumar el valor del depósito agrupado por categoría, ordenado de mayor a menor, es exactamente lo que el dueño quiere ver al cerrar el mes. En la hoja de cálculo eso es una tabla dinámica que hay que rehacer cada vez; aquí es una sola instrucción que siempre lee los datos del momento.
sql_grupo = ("SELECT categoria, COUNT(*) AS articulos, "
"SUM(precio * existencias) AS valor FROM productos "
"GROUP BY categoria ORDER BY valor DESC")
Qué vas a ver en pantalla
La salida está en español, con los números en el formato de la casa. Un trozo de la consulta y del listado de productos:
SQL: INSERT INTO productos (codigo, producto, categoria, precio, existencias) VALUES (?, ?, ?, ?, ?) Productos insertados: 8 ---------------------------------------------------------------------------------------------- Código Producto Categoría Precio Existencias Valor ---------------------------------------------------------------------------------------------- E01 Cable THHN 12 AWG (metro) Eléctrico 3.600,00 500 1.800.000,00 E02 Breaker 20 A Eléctrico 42.800,00 24 1.027.200,00 E03 Cinta aislante negra Eléctrico 5.900,00 200 1.180.000,00 H01 Taladro percutor 650 W Herramientas 289.900,00 12 3.478.800,00 H02 Martillo de bola 16 oz Herramientas 45.900,00 40 1.836.000,00 H03 Llave ajustable 10 pulg Herramientas 62.900,00 18 1.132.200,00 P01 Tubo PVC 1/2 pulg x 3 m Plomería 18.900,00 120 2.268.000,00 P02 Llave de paso 1/2 pulg Plomería 34.500,00 35 1.207.500,00 ---------------------------------------------------------------------------------------------- Filas consultadas: 8
Y el cierre, con el dato que de verdad se lleva el dueño a la reunión:
Productos en la tabla: 7 Valor total del inventario: 12.899.700,00 Archivo generado: salida/tienda.db
Errores comunes y consejos
- Ejecutar el programa dos veces seguidas no ensucia nada: borra la base anterior y la vuelve a crear, así que la salida es siempre la misma y se puede comparar.
- Si edita el archivo de productos, respete las comas y los encabezados. Un espacio de más en el nombre de una columna deja la carga sin datos.
- El archivo de la base no se abre con doble clic como una hoja de cálculo: hace falta una herramienta que hable el idioma de las consultas, y eso es justo lo que hace el programa.
- No mueva el programa a mitad de camino: busca sus datos junto a sí mismo, de modo que si quiere correrlo desde otra carpeta, mueva el paquete completo.
- Antes de probar cambios, copie el archivo de la base a otra carpeta. Copiar un solo archivo es todo el respaldo que necesita.
- Los precios se guardan en pesos enteros, sin centavos binarios, y el valor de cada línea se calcula al consultar. Así el total nunca arrastra un centavo de diferencia.
Cuándo esto no alcanza
Este programa es el punto de partida correcto cuando usted quiere que el inventario viva en un solo lugar y ya perdió el miedo a la terminal. Pero hay un momento en que el negocio pide más: varias personas trabajando a la vez, facturación, compras, informes que el contador pueda imprimir sin ayuda de nadie, respaldos automáticos y botones en lugar de líneas de texto. Ahí es cuando un programa hecho para eso —como Kardex Tauro, que es gratis y sirve para ordenar el inventario— se vuelve la opción sensata: por dentro sigue siendo una base SQLite, solo que ya no la tiene que escribir usted. Mientras llega ese momento, este ZIP y Kardex Tauro comparten la misma idea de fondo: los datos del negocio se guardan una sola vez y bien.
⬇ Descargar el código (ZIP)Descargue el paquete, ejecútelo una vez y lea la pantalla con calma. Son siete pasos y, al final, su inventario ya vive en una sola base de datos.