es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Forma pythonica de ejecutar (con try & except) archivos SQL pre-construidos y obtener respuestas/errores del servidor.

Estoy ejecutando una serie de declaraciones SQL una por una (las salidas de las primeras se utilizan más adelante). Estas consultas son creaciones de tablas, alteraciones de tablas y actualizaciones de vistas.

Puedo ejecutarlas en Python una por una, pero por motivos de registro y protocolos de seguridad, necesito averiguar cómo lograr los siguientes resultados:
1. Si la consulta falla, obtener la respuesta de vuelta.
2. Utilizar correctamente los bloques try y except para no modificar nada que no se ejecute completamente.

Aquí está el código que tengo que funciona hoy en día (recorriendo directorios y archivos dentro de directorios). Hay algunas declaraciones de variables y configuración de directorio de sistema operativo antes de ingresar al bucle aquí.

EDIT: El alias tls es un módulo de herramientas creado por mí con el que trabajo, la función tls.createlakeengine() simplemente crea un engine para conectarse a mi servidor SQL utilizando el método create_engine de SQLAlchemy.

for file in contents:
    # verificar si el archivo es una declaración SQL o un módulo de Python
    if file.endswith('.sql'):
        # leer la consulta
        file_contents = open(file).read()
        statements = file_contents.split(';')
        print('ejecutando {} declaraciones desde el archivo {}'.format(
            len(statements), file))
        statements = [x.strip() for x in statements]
        i = 0
        for statement in statements:
            i+=1
            print('\tejecutando declaración {}'.format(i))
            engine = tls.create_lake_engine()
            conn = engine.connect()
            trans = conn.begin()
            conn.execute(statement)
            trans.commit()
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para lograr los resultados deseados, puede modificar el código actual con el bloque try-except de la siguiente manera:

    for file in contents:
        # verificar si el archivo es una declaración SQL o un módulo de Python
        if file.endswith('.sql'):
            # leer la consulta
            file_contents = open(file).read()
            statements = file_contents.split(';')
            print('ejecutando {} declaraciones del archivo {}'.format(
                len(statements), file))
            statements = [x.strip() for x in statements]
            i = 0
            for statement in statements:
                i+=1
                print('\tejecutando declaración {}'.format(i))
                engine = tls.create_lake_engine()
                conn = engine.connect()
                trans = conn.begin()
                try:
                    conn.execute(statement)
                    trans.commit()
                except Exception as e:
                    trans.rollback()
                    print('Error al ejecutar la declaración: {}'.format(statement))
                    print('Mensaje de error: {}'.format(str(e)))
    

    Aquí, el bloque try ejecutará la declaración SQL utilizando conn.execute(statement) y, si falla, generará una excepción. En el bloque except, capturamos la excepción, imprimimos un mensaje de error con la declaración que falló y el mensaje de error, y revertimos la transacción utilizando trans.rollback(). Esto asegura que cualquier cosa que no se ejecute completamente no sea afectada, como se indica en los requisitos.

    ¡Espero que esto ayude!

Comments are closed.