Ahora vamos a poder corregir el precio de un producto que ya existe en la base de datos, sin borrarlo y volver a cargarlo.
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 y agrega productos.
Aprender a actualizar datos en SQLite desde Python. Vamos a agregar casillas para elegir el id del producto y su precio nuevo, y un botón "Modificar precio" que actualice ese registro en la base con la instrucción UPDATE.
UPDATE necesita un WHERE para saber qué fila modificar. Si te olvidás del WHERE, ¡se modifican todos los productos a la vez!
Para modificar un producto necesitamos saber cuál es. La forma más segura es usar su id, porque nunca se repite entre productos.
id de un producto? Apretá primero "Mostrar productos" y anotá el número que corresponde. (Desafío: más abajo te proponemos mostrar también el id en la lista).
Reemplazá tu kiosco.py por este código. Las líneas resaltadas en violeta son las novedades:
# ========================================================== # APLICACIÓN: Mostrar, AGREGAR y MODIFICAR productos del kiosco # 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() # ---------------------------------------------------------- # NUEVA función: MODIFICA el precio de un producto existente # ---------------------------------------------------------- def modificar_precio(): # Leemos el id del producto y el precio nuevo id_producto = casilla_id.get() precio_nuevo = casilla_precio_nuevo.get() # Nos conectamos a la base de datos conexion = sqlite3.connect("kiosco.db") cursor = conexion.cursor() # UPDATE cambia el precio SOLO de la fila con ese id # Sin el WHERE, ¡se modificarían TODOS los productos! cursor.execute("UPDATE productos SET precio = ? WHERE id = ?", (precio_nuevo, id_producto)) # MUY IMPORTANTE: guardar los cambios en la base conexion.commit() conexion.close() # Vaciamos las casillas para poder modificar otro producto casilla_id.delete(0, tk.END) casilla_precio_nuevo.delete(0, tk.END) # Volvemos a mostrar la lista, ya con el precio actualizado mostrar_productos() # ---------------------------------------------------------- # Creación de la ventana con tkinter # ---------------------------------------------------------- ventana = tk.Tk() ventana.title("Kiosco") ventana.geometry("320x560") # 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 --- # Casilla para el id del producto etiqueta_id = tk.Label(ventana, text="Id del producto a modificar:") etiqueta_id.pack() casilla_id = tk.Entry(ventana) casilla_id.pack() # Casilla para el precio nuevo etiqueta_precio_nuevo = tk.Label(ventana, text="Precio nuevo:") etiqueta_precio_nuevo.pack() casilla_precio_nuevo = tk.Entry(ventana) casilla_precio_nuevo.pack() # Botón que llama a la función modificar_precio boton_modificar = tk.Button(ventana, text="Modificar precio", command=modificar_precio) boton_modificar.pack(pady=10) ventana.mainloop()
Ejecutá el programa y presioná "Mostrar productos" para ver los ids. Elegí uno, escribí un precio nuevo y presioná "Modificar precio". El precio de ese producto debería actualizarse en la lista. 🎉
kiosco.db con DB Browser y mirá la pestaña "Examinar datos". El precio tiene que estar actualizado.
UPDATE tabla SET campo = ? WHERE condicion → modifica filas que ya existen.WHERE es obligatorio si solo querés cambiar una fila. Sin él, se modifican todas.id en el WHERE porque es único: nunca hay dos productos con el mismo id.? tiene que coincidir con el orden de la tupla: primero el precio nuevo (lo que va en SET), después el id (lo que va en WHERE).| Instrucción | ¿Para qué sirve? | ¿Necesita commit()? |
|---|---|---|
SELECT | Leer datos existentes | No |
INSERT | Agregar una fila nueva | Sí |
UPDATE | Modificar una fila existente | Sí |
UPDATE productos SET precio = 100 sin el WHERE?id para identificar el producto y no el nombre?cursor.execute("UPDATE productos SET precio = ? WHERE id = ?", (precio_nuevo, id_producto)), ¿qué signo ? se reemplaza por precio_nuevo y cuál por id_producto?id que no existe en la tabla, ¿qué pasa cuando presionás "Modificar precio"? ¿Da error?cursor.rowcount después del UPDATE para saber si modificó alguna fila.DELETE FROM productos WHERE id = ?.