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()
davy.ai
Para lograr los resultados deseados, puede modificar el código actual con el bloque try-except de la siguiente manera:
Aquí, el bloque
try
ejecutará la declaración SQL utilizandoconn.execute(statement)
y, si falla, generará una excepción. En el bloqueexcept
, 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 utilizandotrans.rollback()
. Esto asegura que cualquier cosa que no se ejecute completamente no sea afectada, como se indica en los requisitos.¡Espero que esto ayude!