Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Error en la función borrar (sqlite3)
#1
Estoy haciendo un ejercicio (Video CRUD 1 de Sergio Granizo HD5xacNn-5c en el 42:10 aprox.)  y aunque al autor le funciona perfectamente a mí me da siempre error en esta función, borrar, sin pulsar el botón Borrar, sino al probar.

Tengo una BD, personal, y una tabla, empleado, el índice es Id, que lo tengo en la tabla como int key etc.;,  miId lo tenía definido en la lista de variables como StringVar, lo he cambiado a IntVar, pero me sigue dando error. 

Yo creo que sea la concatenación WHERE Id =+ "  "  +miId.get() lo que genera el error, pero he hecho todos los cambios  que se me han ocurrido sin resultado. Es cierto que se lee con alguna dificultad el video  y por  ahí pudiera venir también un error mío.  También es comprensible que si le ordenara que borrara y no hubiera, como no hay, ningun registro me dierra un error, pero es que me da error sin pedirle nada. El autor dijo en el video que ahí había un error y que luego lo repararía. Sigue tal cual. Me he dirigido al autor infrutuosamente.

Código:
def borrar():
     miConn=sqlite3.connect('personal.db')
     miCursor=miConn.cursor()  
 
try:
    miConn=sqlite3.connect('personal.db')
    miCursor= miConn.cursor()
   
    if messagebox.askyesno(messagebox="¿Realmente desea eliminar el registro?", title="ADVERTENCIA"):
   
       miCursor.EXECUTE("DELETE FROM empleado WHERE Id=+""+miId.get()")
       miConn.commit()
except:
      messagebox.showwarning("ADVERTENCIA", "Ocurrió un error al tratar de eliminar el registro.")
          pass
   
limpiarCampos()
mostrar()

¿Me podríais ayudar? Muchs gracias-
Responder
#2
Hola.

Hay varios errores. El primero es que tu función borrar() solo tiene dos líneas de código. A partir del "try", todo eso está fuera de la función porque no tiene sangría (entiendo que eso debería ir adentro de la función). Por otro lado, usando un try/except a secas evitás que Python muestre el error específico que estás obteniendo, lo cual es un problema. Sería conveniente borrar momentáneamente el try/except para dejar que la excepción se propague. En tercer lugar, esta línea:

  1. miCursor.EXECUTE("DELETE FROM empleado WHERE Id=+""+miId.get()")


Entiendo que debería ser así:

  1. miCursor.execute("DELETE FROM empleado WHERE Id=" + miId.get())


execute() va en minúsculas (Python distingue mayúsculas de minúsculas) y miId.get() va sin comillas porque no es una cadena, sino una expresión que esperamos Python evalúe y cuyo resultado debe concatenarse a la cadena anterior. Si miId es un IntVar() deberías convertirlo a una cadena antes de usarlo, o simplemente emplear el mecanismo de inyección de variables en cadenas que se ocupa de las conversiones:

  1. miCursor.execute(f"DELETE FROM empleado WHERE Id={miId.get()}")


En suma, la función debería ser esta:

Código:
def borrar():
    miConn=sqlite3.connect('personal.db')
    miCursor=miConn.cursor()  
    try:
        if messagebox.askyesno(messagebox="¿Realmente desea eliminar el registro?", title="ADVERTENCIA"):
            miCursor.execute(f"DELETE FROM empleado WHERE Id={miId.get()}")
            miConn.commit()
    except:
        messagebox.showwarning("ADVERTENCIA", "Ocurrió un error al tratar de eliminar el registro.")

Saludos
Responder
#3
Gracias por la respuesta. Pongo manos a la obra.
Responder
#4
(31-03-2022, 01:18 AM)Francisco escribió: Hola.

Hay varios errores. El primero es que tu función borrar() solo tiene dos líneas de código. A partir del "try", todo eso está fuera de la función porque no tiene sangría (entiendo que eso debería ir adentro de la función). Por otro lado, usando un try/except a secas evitás que Python muestre el error específico que estás obteniendo, lo cual es un problema. Sería conveniente borrar momentáneamente el try/except para dejar que la excepción se propague. En tercer lugar, esta línea:

  1. miCursor.EXECUTE("DELETE FROM empleado WHERE Id=+""+miId.get()")


Entiendo que debería ser así:

  1. miCursor.execute("DELETE FROM empleado WHERE Id=" + miId.get())


execute() va en minúsculas (Python distingue mayúsculas de minúsculas) y miId.get() va sin comillas porque no es una cadena, sino una expresión que esperamos Python evalúe y cuyo resultado debe concatenarse a la cadena anterior. Si miId es un IntVar() deberías convertirlo a una cadena antes de usarlo, o simplemente emplear el mecanismo de inyección de variables en cadenas que se ocupa de las conversiones:

  1. miCursor.execute(f"DELETE FROM empleado WHERE Id={miId.get()}")


En suma, la función debería ser esta:

Código:
def borrar():
    miConn=sqlite3.connect('personal.db')
    miCursor=miConn.cursor() 
    try:
        if messagebox.askyesno(messagebox="¿Realmente desea eliminar el registro?", title="ADVERTENCIA"):
            miCursor.execute(f"DELETE FROM empleado WHERE Id={miId.get()}")
            miConn.commit()
    except:
        messagebox.showwarning("ADVERTENCIA", "Ocurrió un error al tratar de eliminar el registro.")

Saludos

Gracias, Francisco, por tu respuesta. Me ha sido muy útil para aclarar esta cuestión que es bien fundamental. He hecho varios ejercicios para dejarme el asunto claro del todo. Que tengas un buen día.
Responder
#5
¡Un placer! Smile
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)