135 lines
4.5 KiB
Python
135 lines
4.5 KiB
Python
# Utilidades para conexión a BD - Reutilizado y ajustado de database.py v1
|
|
import pyodbc
|
|
from App.Config.GeneralConfig import ConfigDatabase # Ajusta si GeneralConfig tiene otra estructura
|
|
|
|
class DatabaseManager:
|
|
def __init__(self, database, databaseID):
|
|
self.db_database = database
|
|
self.db_user = ConfigDatabase.db_user
|
|
self.db_password = ConfigDatabase.db_password
|
|
self.db_host = ConfigDatabase.db_host
|
|
self.db_databaseID = databaseID
|
|
|
|
def _connect(self):
|
|
try:
|
|
self.conn_str = (
|
|
'DRIVER={ODBC Driver 18 for SQL Server};'
|
|
f'SERVER={self.db_host};'
|
|
f'DATABASE={self.db_database};'
|
|
f'UID={self.db_user};'
|
|
f'PWD={self.db_password};'
|
|
f'Encrypt=yes;'
|
|
f'TrustServerCertificate=yes;'
|
|
)
|
|
#print(self.conn_str)
|
|
self.connection = pyodbc.connect(self.conn_str)
|
|
except pyodbc.Error as e:
|
|
print(f"Error al conectar a la base de datos: {e}")
|
|
self.connection = None
|
|
|
|
def _disconnect(self):
|
|
if self.connection:
|
|
self.connection.close()
|
|
|
|
# Función para ejecutar queries que retornan valores
|
|
def get_execute_query(self, query):
|
|
self._connect()
|
|
if not self.connection:
|
|
return None, "Error de conexión"
|
|
|
|
|
|
self.cursor = self.connection.cursor()
|
|
self.cursor.execute(query)
|
|
columns = [col[0] for col in self.cursor.description]
|
|
data = self.cursor.fetchall()
|
|
results = [dict(zip(columns, row)) for row in data]
|
|
self.cursor.close()
|
|
self._disconnect()
|
|
return results
|
|
|
|
|
|
# Función para ejecutar queries que retornan valores
|
|
def get_execute_query2(self, query):
|
|
self._connect()
|
|
if not self.connection:
|
|
return None, "Error de conexión"
|
|
|
|
try:
|
|
self.cursor = self.connection.cursor()
|
|
self.cursor.execute(query)
|
|
columns = [col[0] for col in self.cursor.description]
|
|
data = self.cursor.fetchall()
|
|
results = [dict(zip(columns, row)) for row in data]
|
|
self.cursor.close()
|
|
return results, None
|
|
except Exception as e:
|
|
print(f"Error al ejecutar la consulta SELECT: {e} \n {query}")
|
|
return None, str(e)
|
|
finally:
|
|
self._disconnect()
|
|
|
|
# Función para ejecutar queries que no retornan valores
|
|
def set_execute_query(self, query):
|
|
self._connect()
|
|
if not self.connection:
|
|
return False
|
|
|
|
try:
|
|
cursor = self.connection.cursor()
|
|
cursor.execute(query)
|
|
self.connection.commit()
|
|
cursor.close()
|
|
return True
|
|
except Exception as e:
|
|
print(f"Error al ejecutar la consulta de modificación: {e}")
|
|
return False
|
|
finally:
|
|
self._disconnect()
|
|
|
|
def log_execution(self, procedure_id, procedure_name, status, message, executed_by, extra_info, target_date, date,
|
|
procedure_type='PYTHON_APP', source='PYTHON_TRANSFERDATA_APP'):
|
|
self._connect()
|
|
if not self.connection:
|
|
return
|
|
self.cursor = self.connection.cursor()
|
|
|
|
sql = """
|
|
DECLARE @ExecID VARCHAR(50), @FieldID VARCHAR(50);
|
|
EXEC dbo.InsertExecutionLog
|
|
@ProcedureID = ?,
|
|
@ProcedureName = ?,
|
|
@ProcedureType = ?,
|
|
@Date = ?,
|
|
@TargetDate = ?,
|
|
@Status = ?,
|
|
@ExecutedBy = ?,
|
|
@MessageDescription = ?,
|
|
@Source = ?,
|
|
@ExtraInfo = ?,
|
|
@ExecutionIDGenerated = @ExecID OUTPUT,
|
|
@FieldIDGenerated = @FieldID OUTPUT;
|
|
SELECT @ExecID AS ExecutionID, @FieldID AS FieldID;
|
|
"""
|
|
|
|
try:
|
|
self.cursor.execute(sql, (
|
|
procedure_id, procedure_name, procedure_type,
|
|
date, target_date, status,
|
|
executed_by, message, source, extra_info
|
|
))
|
|
row = self.cursor.fetchone()
|
|
self.connection.commit()
|
|
except Exception as e:
|
|
print(f"Error en log_execution: {e}")
|
|
finally:
|
|
self._disconnect()
|
|
|
|
|
|
|
|
|
|
# Función simple para compatibilidad (usa DatabaseManager internamente)
|
|
def get_db_connection(database='tu_db', databaseID='default'):
|
|
manager = DatabaseManager(database, databaseID)
|
|
manager._connect()
|
|
return manager.connection # Devuelve la conexión cruda para pandas, etc.
|