diff --git a/recursos/leccion2/mysql/sistema/main.py b/recursos/leccion2/mysql/sistema/main.py index dfd4f99..7712343 100644 --- a/recursos/leccion2/mysql/sistema/main.py +++ b/recursos/leccion2/mysql/sistema/main.py @@ -1,6 +1,4 @@ -""" -Programa para realizar operaciones a base de datos MySQL -""" +"""Programa para realizar operaciones a base de datos MySQL""" import logging from settings import ( @@ -62,7 +60,7 @@ def crear_conexion(servidor, puerto, usuario, contrasena, bd): database=credenciales["database"], ) logging.info( - f"¡Conexión a la base de datos '{credenciales['database']}' fue exitosa!\n" + f"✅ ¡Conexión a la base de datos '{credenciales['database']}' fue exitosa!\n" ) except Error as err: if err.args[0] == DBACCESS_DENIED_ERROR: @@ -70,9 +68,9 @@ def crear_conexion(servidor, puerto, usuario, contrasena, bd): "\x1b[1;31mERROR: ¡Algo está mal con su nombre de usuario o contraseña!" ) elif err.args[0] == BAD_DB_ERROR: - logging.error("\x1b[1;31mERROR: ¡La base de datos no existe!") + logging.error("\x1b[1;31m❌ ERROR: ¡La base de datos no existe!") else: - logging.error(f"\x1b[1;31mERROR: ¡Se produjo lo siguiente: '{err}'") + logging.error(f"\x1b[1;31m❌ ERROR: Se produjo lo siguiente: '{err}'") return conexion_bd @@ -88,13 +86,13 @@ def crear_base_datos(conexion_bd, create_database_sql, bd): # Crear un objeto cursor para ejecutar script SQL cursor = conexion_bd.cursor() try: - # Insertar una base de datos en el servidor MySQL + # Crear una base de datos en el servidor MySQL cursor.execute(create_database_sql, bd) - logging.info(f"¡Creación exitosa de la base de datos '{bd}'!\n") + logging.info(f"✅ ¡Creación exitosa de la base de datos '{bd}'!\n") except ProgrammingError as e: - logging.error(f"ERROR: ¡Se produjo una falla de programación: '{e}'!") + logging.error(f"❌ ERROR: ¡Se produjo una falla de programación: '{e}'!") except OperationalError as e: - logging.error(f"ERROR: Se produjo lo siguiente: '{e}'") + logging.error(f"❌ ERROR: Se produjo lo siguiente: '{e}'") return conexion_bd @@ -110,19 +108,21 @@ def crear_tablas(conexion_bd, create_table_sql): cursor = conexion_bd.cursor() # Crear la tabla(s) si no existe cursor.execute(create_table_sql) - # Confirmar la creación de la tabla + # Hacer persistentes los cambios en la base de datos conexion_bd.commit() logging.info( - f"¡Fueron creado(s) {cursor.rowcount} tabla(s) correctamente en la base de datos!\n" + f"✅ ¡Fueron creado(s) {cursor.rowcount} tabla(s) correctamente en la base de datos!\n" ) # Cerrar el cursor cursor.close() except Error as error: - logging.error(f"¡Fallo la creación de tabla(s) en la base de datos!: {error}") + logging.error( + f"❌ ERROR: ¡Fallo la creación de tabla(s) en la base de datos!: {error}" + ) def insertar_registro(conexion_bd, insert_values, insert_sql): - """Inserción de registro de la tabla + """Función para la inserción de registro de la tabla Args: conexion_bd (Connection): Representación conexión a la base de datos MySQL @@ -132,34 +132,32 @@ def insertar_registro(conexion_bd, insert_values, insert_sql): try: # Crear un objeto cursor para ejecutar script SQL cursor = conexion_bd.cursor() - # Confirmar la creación de la tabla - conexion_bd.commit() # Insertar nuevos registros en la tabla cursor.executemany(insert_sql, insert_values) - # Confirmar la inserción de los registros - conexion_bd.commit() logging.info( - f"¡Fueron insertado(s) {cursor.rowcount} registro(s) correctamente en la tabla!\n" + f"✅ ¡Fueron insertado(s) {cursor.rowcount} registro(s) correctamente en la tabla!\n" ) # Insertar un nuevo registro en la tabla cursor.execute( insert_sql, (4, "Liliana", "Andradez", "3105", "+58-414-6782473") ) - # Confirmar la inserción del registro + # Hacer persistentes los cambios en la base de datos conexion_bd.commit() logging.info( - f"¡Fueron insertado(s) {cursor.rowcount} registro(s) correctamente en la tabla!\n" + f"✅ ¡Fueron insertado(s) {cursor.rowcount} registro(s) correctamente en la tabla!" ) # Cerrar el cursor cursor.close() except IntegrityError as error: - logging.error(f"¡Registro duplicado por clave primaria!: {error}") + logging.error(f"❌ ERROR: ¡Registro duplicado por clave primaria!: {error}") except Error as error: - logging.error(f"¡Fallo la inserción de registro(s) en la tabla!: {error}") + logging.error( + f"❌ ERROR: ¡Fallo la inserción de registro(s) en la tabla!: {error}" + ) def consultar_registro(conexion_bd, select_sql): - """Consulta de registro(s) de la tabla + """Función para la consulta de registro(s) de la tabla Args: conexion_bd (Connection): Representación conexión a la base de datos MySQL @@ -173,8 +171,8 @@ def consultar_registro(conexion_bd, select_sql): # Recuperar los registros de la consulta registros = cursor.fetchall() # Mostrar los registros de la tabla - print(f"Total de filas son: {len(registros)} \n") - print("Mostrar cada fila: \n") + print(f"\n📜 Total de filas son: {len(registros)} \n") + print("📜 Mostrar cada fila: \n") for fila in registros: print(f"\tId: {fila[0]}") print(f"\tNombre: {fila[1]} {fila[2]}") @@ -183,35 +181,39 @@ def consultar_registro(conexion_bd, select_sql): # Cerrar el cursor cursor.close() except Error as error: - logging.error(f"¡Fallo la consulta de registro(s) en la tabla!: {error}") + logging.error( + f"❌ ERROR: ¡Fallo la consulta de registro(s) en la tabla!: {error}" + ) def actualizar_registro(conexion_bd, update_values, update_sql): - """Actualización de registro de la tabla + """Función para la actualización de registro de la tabla Args: conexion_bd (Connection): Representación conexión a la base de datos MySQL update_values (list): Lista de filas a actualizar - update_sql (str): _description_ + update_sql (str): Script UPDATE SQL a usar al actualizar datos """ try: # Crear un objeto cursor para ejecutar script SQL cursor = conexion_bd.cursor() # Actualizar nuevos registros en la tabla cursor.executemany(update_sql, update_values) - # Guardar los cambios en la base de datos + # Hacer persistentes los cambios en la base de datos conexion_bd.commit() logging.info( - f"¡Fueron actualizado(s) {cursor.rowcount} registro(s) correctamente en la tabla!\n" + f"✅ ¡Fueron actualizado(s) {cursor.rowcount} registro(s) correctamente en la tabla!\n" ) # Cerrar el cursor cursor.close() except Error as error: - logging.error(f"¡Fallo la actualización de registro(s) en la tabla!: {error}") + logging.error( + f"❌ ERROR: ¡Fallo la actualización de registro(s) en la tabla!: {error}" + ) def eliminar_registro(conexion_bd, delete_sql): - """Eliminación de registro de la tabla + """Función para la eliminación de registro de la tabla Args: conexion_bd (Connection): Representación conexión a la base de datos MySQL @@ -222,23 +224,38 @@ def eliminar_registro(conexion_bd, delete_sql): cursor = conexion_bd.cursor() # Eliminar un fila de registro simple cursor.execute(delete_sql) - # Guardar los cambios en la base de datos + # Hacer persistentes los cambios en la base de datos conexion_bd.commit() - logging.info("¡Registro eliminado correctamente!\n") + logging.info("✅ ¡Registro eliminado correctamente!\n") # Cerrar el cursor cursor.close() except Error as error: - logging.error(f"¡Fallo la eliminación de registro(s) en la tabla!: {error}") + logging.error( + f"❌ ERROR: ¡Fallo la eliminación de registro(s) en la tabla!: {error}" + ) if __name__ == "__main__": - # Crear conexión con un servidor MySQL - conexion = crear_conexion(HOST, PORT, USER, PASSW, DB) - # Crear la base de datos - # crear_base_datos(conexion, CREATE_DATABASE_SQL, DB) - # Crear la tabla dentro de la base de datos - crear_tablas(conexion, CREATE_TABLE_SQL) - insertar_registro(conexion, INSERT_MULTIPLE_COLUMNS, INSERT_SQL_SCRIPTS) - consultar_registro(conexion, SELECT_SQL_SCRIPTS) - actualizar_registro(conexion, UPDATE_MULTIPLE_COLUMNS, UPDATE_SQL_SCRIPTS) - eliminar_registro(conexion, DELETE_SQL_SCRIPTS) + conexion = None + try: + # Crear conexión al servidor MySQL + conexion = crear_conexion(HOST, PORT, USER, PASSW, DB) + # Crear la base de datos + # crear_base_datos(conexion, CREATE_DATABASE_SQL, DB) + # Crear la tabla dentro de la base de datos + crear_tablas(conexion, CREATE_TABLE_SQL) + insertar_registro(conexion, INSERT_MULTIPLE_COLUMNS, INSERT_SQL_SCRIPTS) + consultar_registro(conexion, SELECT_SQL_SCRIPTS) + actualizar_registro(conexion, UPDATE_MULTIPLE_COLUMNS, UPDATE_SQL_SCRIPTS) + eliminar_registro(conexion, DELETE_SQL_SCRIPTS) + except Error as e: + logging.error( + f"❌ ERROR: ¡Se produjo un falla al establecer la conexión a la base de datos '{DB}': '{e}'!" + ) + finally: + if conexion: + # Cerrar la conexión a la base de datos + conexion.close() + logging.info( + f"✅ ¡La conexión PostgreSQL a la base de datos '{DB}' fue cerrada!" + ) diff --git a/recursos/leccion2/postgresql/sistema/main.py b/recursos/leccion2/postgresql/sistema/main.py index 13642df..9717c6b 100644 --- a/recursos/leccion2/postgresql/sistema/main.py +++ b/recursos/leccion2/postgresql/sistema/main.py @@ -16,8 +16,8 @@ UPDATE_SQL_SCRIPTS, DELETE_SQL_SCRIPTS, ) -from psycopg2.errors import Error, DatabaseError, OperationalError, ProgrammingError from psycopg2 import connect +from psycopg2.errors import Error, DatabaseError, OperationalError, ProgrammingError logging.basicConfig(level=logging.INFO) @@ -119,7 +119,7 @@ def insertar_registro(conexion_bd, insert_values, insert_sql): """Función para la inserción de registro de la tabla Args: - conexion_bd (Connection): Representación conexión a la base de datos SQLite + conexion_bd (Connection): Representación conexión a la base de datos PostgreSQL insert_values (list): Lista de filas a ingresar insert_sql (str): Script INSERT SQL a usar al ingresar datos """ @@ -133,7 +133,7 @@ def insertar_registro(conexion_bd, insert_values, insert_sql): ) # Insertar un nuevo registro en la tabla cursor.execute( - INSERT_SQL_SCRIPTS, (4, "Liliana", "Andradez", "3105", "+58-414-6782473") + insert_sql, (4, "Liliana", "Andradez", "3105", "+58-414-6782473") ) # Hacer persistentes los cambios en la base de datos conexion_bd.commit() @@ -152,7 +152,7 @@ def consultar_registro(conexion_bd, select_sql): """Función para la consulta de registro(s) de la tabla Args: - conexion_bd (Connection): Representación conexión a la base de datos SQLite + conexion_bd (Connection): Representación conexión a la base de datos PostgreSQL select_sql (str): Script SELECT SQL a usar al consultar datos """ try: @@ -182,7 +182,7 @@ def actualizar_registro(conexion_bd, update_values, update_sql): """Función para la actualización de registro de la tabla Args: - conexion_bd (Connection): Representación conexión a la base de datos SQLite + conexion_bd (Connection): Representación conexión a la base de datos PostgreSQL update_values (list): Lista de filas a actualizar update_sql (str): Script UPDATE SQL a usar al actualizar datos """ @@ -208,7 +208,7 @@ def eliminar_registro(conexion_bd, delete_sql): """Función para la eliminación de registro de la tabla Args: - conexion_bd (Connection): Representación conexión a la base de datos SQLite + conexion_bd (Connection): Representación conexión a la base de datos PostgreSQL delete_sql (str): Script DELETE SQL a usar al eliminar datos """ try: @@ -240,12 +240,12 @@ def eliminar_registro(conexion_bd, delete_sql): eliminar_registro(conexion, DELETE_SQL_SCRIPTS) except Error as e: logging.error( - f"❌ ERROR: ¡Se produjo un falla al establecer la conexión a la base de datos '{DB_FILE}': '{e}'!" + f"❌ ERROR: ¡Se produjo un falla al establecer la conexión a la base de datos '{DB}': '{e}'!" ) finally: if conexion: # Cerrar la conexión a la base de datos conexion.close() logging.info( - f"✅ ¡La conexión SQLite a la base de datos '{DB_FILE}' fue cerrada!" + f"✅ ¡La conexión PostgreSQL a la base de datos '{DB}' fue cerrada!" ) diff --git a/source/leccion2/mysql.rst b/source/leccion2/mysql.rst index 9b50d5e..f6e6602 100644 --- a/source/leccion2/mysql.rst +++ b/source/leccion2/mysql.rst @@ -559,7 +559,7 @@ Módulo principal del programa. .. literalinclude:: ../../recursos/leccion2/mysql/sistema/main.py :language: python :linenos: - :lines: 1-244 + :lines: 1-261 *Archivo* :file:`docker-compose.yml`