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.