Por último, vamos a poder borrar definitivamente un producto de la base de datos.
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.
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.
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.
Igual que en el ejercicio anterior, usamos el id para identificar sin ambigüedad qué fila queremos borrar.
id de un producto? Apretá primero "Mostrar productos" y anotá el número que corresponde.
Reemplazá tu kiosco.py por este código. Las líneas resaltadas en rojo son las novedades:
# ========================================================== # 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()
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. 🎉
kiosco.db con DB Browser y mirá la pestaña "Examinar datos". El producto ya no tiene que estar en la tabla.
DELETE FROM tabla WHERE condicion → elimina filas que ya existen.WHERE es obligatorio si solo querés borrar una fila. Sin él, se borran todas.UPDATE, acá no hay SET: no cambiamos valores, eliminamos la fila entera.(id_producto,). Es la forma de indicar que es una tupla de un solo elemento.| Instrucción | ¿Para qué sirve? | ¿Necesita WHERE? | ¿Necesita commit()? |
|---|---|---|---|
SELECT | Leer datos existentes | Opcional | No |
INSERT | Agregar una fila nueva | No aplica | Sí |
UPDATE | Modificar una fila existente | Sí (para no afectar a todas) | Sí |
DELETE | Borrar una fila existente | Sí (para no borrar todas) | Sí |
DELETE FROM productos sin el WHERE?UPDATE y DELETE?(id_producto,) lleva una coma después del valor?id que no existe y presionás "Eliminar producto", ¿la aplicación da error? ¿Por qué?messagebox.askyesno("Confirmar", "¿Seguro que querés eliminar este producto?").cursor.rowcount después del DELETE.