Métodos para eliminar y actualizar registros MySQL desde Python

Métodos para eliminar y actualizar registros MySQL desde Python

Empezamos ya con los tres últimos métodos antes de empezar con la interfaz gráfica. El primero será para eliminar registros de una tabla con una condición expresada en la llamada. El segundo, para eliminar todos los registros, pero sin borrar la tabla, y el último, para actualizar registros según una condición.


Métodos para eliminar registros MySQL desde Python

Para eliminar registros de una tabla en MySQL, puedes utilizar la instrucción DELETE seguida de la cláusula WHERE para especificar los criterios de búsqueda de los registros que quieres eliminar. Por ejemplo, para eliminar todos los registros de la tabla "usuarios" que tengan un campo "nombre" igual a "Enrique", la sintaxis sería esta:

DELETE FROM usuarios WHERE nombre = 'Enrique';

Este podría ser un posible código que emule esta instrucción SQL:

    # Método para eliminar registros con una condición
    @conexion
    @comprueba_bd
    def eliminar_registro(self, nombre_bd, nombre_tabla, condiciones):
        try:
            # Se selecciona la base de datos
            self.cursor.execute(f"USE {nombre_bd}")
            # Se crea la instrucción de eliminación
            sql = f"DELETE FROM {nombre_tabla} WHERE {condiciones}"
            # Se ejecuta y confirma
            self.cursor.execute(sql)
            self.conector.commit()
            print("Registros eliminados.")
        except:
            print("Error al intentar borrar registros en la tabla.")

En condiciones, podemos poner cualquier expresión valida después de una cláusula WHERE de SQL. Por ejemplo esto:

base_datos.eliminar_registro("pruebas","usuarios", "nombre = 'Enrique'")

La salida en la consola, será esta:

Resultado en la consola

Se abrió la conexión con el servidor.
Registros eliminados.
Se cerró la conexión con el servidor.

Ten cuidado, ya que esto eliminará todos los registros que tengan el valor "Enrique" en la columna "nombre".

Si te equivocas en la expresión, saltará el except.

Resultado en la consola

Se abrió la conexión con el servidor.
Error al intentar borrar registros en la tabla. Compruebe la expresión.
Se cerró la conexión con el servidor.

Te dejo unos cuantos registros para que los añadas y puedas ir practicando. Debes utilizar el método del capítulo anterior llamado "insertar_registro()".

registros = [
            [{"nombre": "Pedro", "apellidos": "García López", "telefono":"145645645", "direccion": "Calle del Sol #123"}],
            [{"nombre": "Ana", "apellidos": "Martínez Torres", "telefono": "547546775", "direccion": "Avenida del Mar #46"}],
            [{"nombre": "Mario", "apellidos": "Díaz González", "telefono": "654733534", "direccion": "Calle del Parque #20"}],
            [{"nombre": "Sofía", "apellidos": "Torres Fernández", "telefono": "534654645", "direccion": "Calle del Puerto #23"}],
            [{"nombre": "Enrique", "apellidos" : "Barros Fernández", "telefono" : "786959404", "direccion" : "Calle cualquiera #56"}]
            ]

for registro in registros:
    base_datos.insertar_registro("pruebas", "usuarios", registro)

Ahora, pasemos al segundo método. Vamos a hacer un método que elimine todos los registros de la tabla sin tener que dar una expresión.

Esto se consigue usando lo que ya se convirtió en parte de todo un meme. Uno de mis suscriptores, incluso me envió una canción que se hizo sobre el tema.

¡NO EJECUTES NUNCA ESTA INSTRUCCIÓN SIN TENER COPIA DE SEGURIDAD DE LA BASE DE DATOS!

Se trata de un DELETE FROM sin la cláusula WHERE. Al no poner la cláusula WHERE, el servidor entiende como que queremos borrar todos los registros. Aprovechemos esto para crear el método.


DELETE FROM nombre_tabla;

El método quedará así:

    # Método para borrar todos los registros de una tabla
    @conexion  
    @comprueba_bd
    def vaciar_tabla(self, nombre_bd, nombre_tabla):
        try:
            self.cursor.execute(f"USE {nombre_bd}")
            # Se borran todos los registros de una tabla
            sql = f"DELETE FROM {nombre_tabla}"
            self.cursor.execute(sql)
            self.conector.commit()
            print("Se han borrado todos los registros de la tabla.")
        except:
            print("Error al intentar borrar los registros de la tabla.")  

En la llamada, se le pasa la base de datos y la tabla. El método lo borra todo.

base_datos.vaciar_tabla("pruebas", "usuarios")

Si la base de datos existe y la tabla también, se borran todos los registros.

Resultado en la consola

Se abrió la conexión con el servidor.
Se han borrado todos los registros de la tabla.
Se cerró la conexión con el servidor.

En cambio, si alguna de las dos no existe, salta el except:

Resultado en la consola

Se abrió la conexión con el servidor.
Error al intentar borrar los registros de la tabla.
Se cerró la conexión con el servidor.

No obstante, hay una instrucción SQL más eficiente para hacer esta tarea, se trata de TRUNCATE. Esta sería la instrucción SQL:

TRUNCATE TABLE nombre_tabla;

Solo hay que cambiar la línea 7 del método.

    # Método para borrar todos los registros de una tabla
    @conexion
    @comprueba_bd
    def vaciar_tabla(self, nombre_bd, nombre_tabla):
        try:
            self.cursor.execute(f"USE {nombre_bd}")
            # Se borran todos los registros de una tabla
            sql = f"TRUNCATE TABLE {nombre_tabla}"
            self.cursor.execute(sql)
            self.conector.commit()
            print("Se han borrado todos los registros de la tabla.")
        except:
            print("Error al intentar borrar los registros de la tabla.")  

Método para actualizar registros en una tabla MySQL desde Python

Para actualizar registros en una tabla, necesitamos lo siguiente:

  • Nombre de la base de datos.
  • Nombre de la tabla.
  • Campos a modificar.
  • Condición para realizar la modificación.

La instrucción SQL para realizar una actualización de registro, sería como esta:

UPDATE usuarios SET telefono = '123456789' WHERE nombre = 'Enrique';

Aquí tienes una posible solución:


    # Método para actualizar registros en una tabla
    @conexion
    @comprueba_bd
    def actualizar_registro(self, nombre_bd, nombre_tabla, columnas, condiciones):
        try:
          	# Se selecciona la base de datos
            self.cursor.execute(f"USE {nombre_bd}")

            # Crear la instrucción de actualización
            sql = f"UPDATE {nombre_tabla} SET {columnas} WHERE {condiciones}"
            # Se ejecuta la instrucción de actualización y se hace efectiva
            self.cursor.execute(sql)
            self.conector.commit()
            print("Se actualizó el registro correctamente.")
        except:
            print("Ocurrió un error al intentar actualizar el registro.")

Para hacer una prueba, voy a dejar un único registro en la tabla usuarios de la base de datos pruebas.

base_datos.consulta("SELECT * FROM pruebas.usuarios")

Resultado en la consola

Se abrió la conexión con el servidor.
Esta es la salida de la instrucción que has introducido:
[(1, 'Enrique', 'dfssd', '786959404', 'C/cualquiera')]
Se cerró la conexión con el servidor.

Ahora, supongamos que quiero actualizar los apellidos y la calle del registro.

Pues una llamada como esta, me serviría. Puedes alterar a la vez las columnas que quieras.

base_datos.actualizar_registro("pruebas", "usuarios", "apellidos = 'Barros Fernández', direccion = 'Avenida de las ilusiones nº 7'", "nombre = 'Enrique';")

Resultado en la consola

Se abrió la conexión con el servidor.
Se actualizó el registro correctamente.
Se cerró la conexión con el servidor.

En caso de error, saldrá esto:

Resultado en la consola

Se abrió la conexión con el servidor.
Ocurrió un error al intentar actualizar el registro.
Se cerró la conexión con el servidor.

Hacer una actualización así, es una mala práctica, ya que al actualizar, deberíamos centrarnos en la clave primaria de la tabla. La clave primaria, no permite valores duplicados. En los ejemplos que he dado, la clave primaria, es la columna ID.

Por lo tanto, una forma de actualizar siempre el registro que queremos exactamente, es con el ID, ya que cada registro tendrá uno diferente.

En cambio, si actualizas registros con una columna como nombre, puede pasar que haya más de un registro con el nombre "Enrique", entonces, actualizarás a todos los "Enrique" y esto crea un problema grave en la base de datos.

Con esta llamada, me aseguro que la actualización, se realice solo sobre el registro con id = 1.

base_datos.actualizar_registro("pruebas", "usuarios", "apellidos = 'Barros Fernández', direccion = 'Avenida de las ilusiones nº 7'", "id = '1';")

Dejamos ya esta parte del proyecto, podríamos añadir miles de cosas más, pero ya es más que suficiente. Espero que hayas aprendido mucho y que tomes fuerzas para la siguiente fase del proyecto, la interfaz gráfica que maneje todo esto.

No te pierdas nada del curso Máster en Python.


Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

curso Java Entrada anterior La API de Java y la importación de módulos, paquetes y clases
curso Java Entrada siguiente Conversión implícita y explícita de Java