🗑️
Ejercicio 4 · Python + SQLite

Eliminar productos del kiosco 🗑️

Por último, vamos a poder borrar definitivamente un producto de la base de datos.

🔁 Antes de empezar

Este ejercicio continúa el anterior. Necesitás tener listos la base kiosco.db (con la tabla productos) y tu archivo kiosco.py que ya muestra, agrega y modifica productos.

🎯 Objetivo del ejercicio

Aprender a eliminar datos en SQLite desde Python. Vamos a agregar una casilla para elegir el id del producto y un botón "Eliminar producto" que borre esa fila de la base con la instrucción DELETE.

💡

La idea en 3 pasos Qué va a hacer nuestro nuevo botón

🔢Escribo el id a eliminar
🗑️DELETE borra esa fila
👀Vuelvo a mostrar la lista
⚠️ Cuidado: igual que con el UPDATE, el DELETE necesita un WHERE. Si te olvidás del WHERE, ¡se borran todos los productos de la tabla! Y a diferencia de modificar, borrar no se puede deshacer.
1

Pensar qué necesitamos ¿Cómo le decimos a la base qué fila borrar?

Paso 1 Identificar el producto

Igual que en el ejercicio anterior, usamos el id para identificar sin ambigüedad qué fila queremos borrar.

🔎 ¿No te acordás el id de un producto? Apretá primero "Mostrar productos" y anotá el número que corresponde.
2

Escribir el código completo En rojo, todo lo nuevo respecto al ejercicio anterior

Paso 2 El programa completo

Reemplazá tu kiosco.py por este código. Las líneas resaltadas en rojo son las novedades:

kiosco.py
# ==========================================================
# APLICACIÓN: Mostrar, AGREGAR, MODIFICAR y ELIMINAR productos
# La base "kiosco.db" ya existe (creada con DB Browser)
# ==========================================================

import tkinter as tk     # Para la ventana, botones y casillas
import sqlite3           # Para trabajar con la base de datos


# ----------------------------------------------------------
# Función que LEE los productos y los muestra (ya la conocés)
# ----------------------------------------------------------
def mostrar_productos():
    conexion = sqlite3.connect("kiosco.db")
    cursor = conexion.cursor()

    cursor.execute("SELECT id, producto, precio FROM productos")
    filas = cursor.fetchall()

    conexion.close()

    cuadro_texto.delete("1.0", tk.END)
    for fila in filas:
        id_producto = fila[0]
        producto = fila[1]
        precio = fila[2]
        cuadro_texto.insert(tk.END, f"[{id_producto}] {producto} - ${precio}\n")


# ----------------------------------------------------------
# Función que AGREGA un producto a la base (ya la conocés)
# ----------------------------------------------------------
def agregar_producto():
    nombre = casilla_nombre.get()
    precio = casilla_precio.get()

    conexion = sqlite3.connect("kiosco.db")
    cursor = conexion.cursor()

    cursor.execute("INSERT INTO productos (producto, precio) VALUES (?, ?)",
                   (nombre, precio))

    conexion.commit()
    conexion.close()

    casilla_nombre.delete(0, tk.END)
    casilla_precio.delete(0, tk.END)

    mostrar_productos()


# ----------------------------------------------------------
# Función que MODIFICA el precio de un producto (ya la conocés)
# ----------------------------------------------------------
def modificar_precio():
    id_producto = casilla_id.get()
    precio_nuevo = casilla_precio_nuevo.get()

    conexion = sqlite3.connect("kiosco.db")
    cursor = conexion.cursor()

    cursor.execute("UPDATE productos SET precio = ? WHERE id = ?",
                   (precio_nuevo, id_producto))

    conexion.commit()
    conexion.close()

    casilla_id.delete(0, tk.END)
    casilla_precio_nuevo.delete(0, tk.END)

    mostrar_productos()


# ----------------------------------------------------------
# NUEVA función: ELIMINA un producto de la base de datos
# ----------------------------------------------------------
def eliminar_producto():
    # Leemos el id del producto a eliminar
    id_producto = casilla_id_eliminar.get()

    # Nos conectamos a la base de datos
    conexion = sqlite3.connect("kiosco.db")
    cursor = conexion.cursor()

    # DELETE borra SOLO la fila con ese id
    # Sin el WHERE, ¡se borrarían TODOS los productos!
    cursor.execute("DELETE FROM productos WHERE id = ?",
                   (id_producto,))

    # MUY IMPORTANTE: guardar los cambios en la base
    conexion.commit()
    conexion.close()

    # Vaciamos la casilla para poder eliminar otro producto
    casilla_id_eliminar.delete(0, tk.END)

    # Volvemos a mostrar la lista, ya sin el producto eliminado
    mostrar_productos()


# ----------------------------------------------------------
# Creación de la ventana con tkinter
# ----------------------------------------------------------
ventana = tk.Tk()
ventana.title("Kiosco")
ventana.geometry("320x680")     # Un poco más alta que antes

titulo = tk.Label(ventana, text="Lista de productos")
titulo.pack(pady=10)

cuadro_texto = tk.Text(ventana, width=32, height=8)
cuadro_texto.pack()

boton = tk.Button(ventana, text="Mostrar productos", command=mostrar_productos)
boton.pack(pady=10)

# --- Casillas y botón para AGREGAR un producto ---
etiqueta_nombre = tk.Label(ventana, text="Nombre del producto:")
etiqueta_nombre.pack()
casilla_nombre = tk.Entry(ventana)
casilla_nombre.pack()

etiqueta_precio = tk.Label(ventana, text="Precio:")
etiqueta_precio.pack()
casilla_precio = tk.Entry(ventana)
casilla_precio.pack()

boton_agregar = tk.Button(ventana, text="Agregar producto",
                          command=agregar_producto)
boton_agregar.pack(pady=10)

# --- Casillas y botón para MODIFICAR el precio ---
etiqueta_id = tk.Label(ventana, text="Id del producto a modificar:")
etiqueta_id.pack()
casilla_id = tk.Entry(ventana)
casilla_id.pack()

etiqueta_precio_nuevo = tk.Label(ventana, text="Precio nuevo:")
etiqueta_precio_nuevo.pack()
casilla_precio_nuevo = tk.Entry(ventana)
casilla_precio_nuevo.pack()

boton_modificar = tk.Button(ventana, text="Modificar precio",
                           command=modificar_precio)
boton_modificar.pack(pady=10)

# --- Casilla y botón para ELIMINAR un producto ---
etiqueta_id_eliminar = tk.Label(ventana, text="Id del producto a eliminar:")
etiqueta_id_eliminar.pack()
casilla_id_eliminar = tk.Entry(ventana)
casilla_id_eliminar.pack()

# Botón que llama a la función eliminar_producto
boton_eliminar = tk.Button(ventana, text="Eliminar producto",
                          command=eliminar_producto)
boton_eliminar.pack(pady=10)

ventana.mainloop()

Paso 3 Probar la aplicación

Ejecutá el programa y presioná "Mostrar productos" para ver los ids. Elegí uno que quieras borrar, escribilo en la casilla y presioná "Eliminar producto". Ese producto debería desaparecer de la lista. 🎉

🔎 Para comprobar que se borró de verdad: cerrá la app, abrí kiosco.db con DB Browser y mirá la pestaña "Examinar datos". El producto ya no tiene que estar en la tabla.
🆕

¿Qué aprendimos de nuevo? Las piezas clave de este ejercicio

📊

Las 4 instrucciones SQL que ya conocés SELECT, INSERT, UPDATE y ahora DELETE

Instrucción¿Para qué sirve?¿Necesita WHERE?¿Necesita commit()?
SELECTLeer datos existentesOpcionalNo
INSERTAgregar una fila nuevaNo aplica
UPDATEModificar una fila existenteSí (para no afectar a todas)
DELETEBorrar una fila existenteSí (para no borrar todas)
?

Para pensar y responder

🤔 Reflexionamos

  1. ¿Qué pasaría si ejecutamos DELETE FROM productos sin el WHERE?
  2. ¿En qué se parecen y en qué se diferencian UPDATE y DELETE?
  3. ¿Por qué la tupla (id_producto,) lleva una coma después del valor?
  4. Si escribís un id que no existe y presionás "Eliminar producto", ¿la aplicación da error? ¿Por qué?

🚀 Desafíos opcionales