Cerrar el cursor y conexión de MySQL Connector en Python

curso de Python

En este nuevo capítulo, empezamos con la optimización de la clase BaseDatos de nuestro proyecto, ya que cuenta con muchos métodos, que abren conexiones con el servidor MySQL y nunca se cierran.

El cierre del cursor y la conexión MySQL con Python

Algo muy importante cuando trabajamos con bases de datos, es el manejo del cursor y la conexión con el servidor. Hasta ahora, hemos abierto la conexión al servidor al utilizar la clase «BaseDatos» (en el método __init__) y el cursor, pero tras cada uso, no los estamos cerrando. Esto puede llegar a provocar incoherencias en las bases de datos y además, aumenta considerablemente el consumo de recursos del sistema, al tener conexiones abiertas sin usarlas.

Así es, cada vez que ejecutamos alguno de los métodos, estamos abriendo una conexión con el servidor. Esto hace que con cada método que usemos, se vayan consumiendo más y más recursos del sistema.

Con el fin de hacer el proyecto más óptimo, tenemos que ir añadiendo esta mejora.

Método consulta

Este es el código que tengo hasta el momento.

    #Ejecuta y muestra resultados de instrucciones SQL    
    def consulta(self, sql:
            self.cursor.execute(sql)
            print("Esta es la salida de la instrucción que has introducido:")
            print(self.cursor.fetchall()  

Gracias a los bloques try, except, finally, podemos manejar las posibles excepciones y siempre se cierra la conexión al finalizar.

En el bloque try, se intenta ejecutar la instrucción SQL. Si no hay errores, se imprimen todos los registros de la consulta.

En caso de excepción, se avisa de que ocurrió un error.

Independientemente de si hay error o no, se cierran el cursor y la conexión.

    # Método para realizar consultas SQL
    def consulta(self, sql):
        try:
            # Realiza la consulta o modificación de la base de datos
            self.cursor.execute(sql)
            print("Esta es la salida de la instrucción que has introducido:")
            print(self.cursor.fetchall())
        except:
            # Si ocurre una excepción, se avisa en la consola
            print("Ocurrió un error. Revisa la instrucción SQL.") 
        finally:
            # Cierra el cursor y la conexión
            self.cursor.close()
            self.conector.close()
            print("Se cerró la conexión con la base de datos.")

Método para mostrar bases de datos

Con el método anterior, ya podemos hacer lo que hace este método, sin embargo, este método, es para no tener que escribir la instrucción SQL correspondiente, de modo, que lo vamos a mantener.

Así está por el momento:


    #Mostrar bases de datos
    def mostrar_bd(self):
        self.cursor.execute("SHOW DATABASES")
        for bd in self.cursor:
            print(bd)

Le voy a incorporar lo mismo que al otro método:

    def mostrar_bd(self):
        try:
            # Se informa de que se están obteniendo las bases de datos
            print("Aquí tienes el listado de las bases de datos del servidor:")
            # Realiza la consulta para mostrar las bases de datos
            self.cursor.execute("SHOW DATABASES")
            print(self.cursor.fetchall())
        except:
            # Si ocurre una excepción, se avisa en la consola
            print("No se pudieron obtener las bases de datos. Comprueba la conexión con el servidor.")
        finally:
            # Cierra el cursor y la conexión
            self.cursor.close()
            self.conector.close()
            print("Se cerró la conexión con la base de datos.")

Probemos la llamada:

base_datos.mostrar_bd()

Resultado en la consola

Aquí tienes el listado de las bases de datos del servidor:
[(‘information_schema’,), (‘mysql’,), (‘performance_schema’,), (‘pruebas’,), (‘sakila’,), (‘sys’,), (‘world’,)]
Se cerró la conexión con la base de datos.

Puede que prefieras la forma anterior, la de iterar con un bucle que salga una base de datos por fila.

Para hacer esto, almacena el resultado del fetchall() en una variable y la iteras:

    def mostrar_bd(self):
        try:
            # Se informa de que se están obteniendo las bases de datos
            print("Aquí tienes el listado de las bases de datos del servidor:")
            # Realiza la consulta para mostrar las bases de datos
            self.cursor.execute("SHOW DATABASES")
            resultado = self.cursor.fetchall()
            # Recorre los resultados y los muestra por pantalla
            for bd in resultado:
                print(bd)
        except:
            # Si ocurre una excepción, se avisa en la consola
            print("No se pudieron obtener las bases de datos. Comprueba la conexión con el servidor.")
        finally:
            # Cierra el cursor y la conexión
            self.cursor.close()
            self.conector.close()
            print("Se cerró la conexión con la base de datos.")

El resultado de la llamada será este:

Resultado en la consola

Aquí tienes el listado de las bases de datos del servidor:
(‘information_schema’,)
(‘mysql’,)
(‘performance_schema’,)
(‘pruebas’,)
(‘sakila’,)
(‘sys’,)
(‘world’,)
Se cerró la conexión con la base de datos.

Si no quieres que los resultados estén en tuplas, puedes iterar de esta forma, accediendo al índice 0 de cada tupla (solo hay un elemento por tupla). Solo añade el [0] al print() del bucle.

print(bd[0])

Resultado en la consola

Aquí tienes el listado de las bases de datos del servidor:
information_schema
mysql
performance_schema
pruebas
sakila
sys
world
Se cerró la conexión con la base de datos.

Si quieres hacer adornos, utiliza el formateo de strings:

print(f"-{bd[0]}.")

Resultado en la consola

Aquí tienes el listado de las bases de datos del servidor:
-information_schema.
-mysql.
-performance_schema.
-pruebas.
-sakila.
-sys.
-world.
Se cerró la conexión con la base de datos.

En el siguiente capítulo, seguiremos mejorando el código.

Aquí tienes todo el temario del curso Máster en Python.


Cerrar el cursor y conexión de MySQL Connector en Python

Deja una respuesta

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

Scroll hacia arriba