diff --git a/services/db.py b/services/db.py index 6f727c80..352af316 100644 --- a/services/db.py +++ b/services/db.py @@ -28,6 +28,7 @@ else: echo=False, connect_args={"check_same_thread": False} ) + inspector = inspect(engine) configure_mappers() T = TypeVar("T") @@ -37,7 +38,7 @@ FILTERED_FIELDS = ["_sa_instance_state", "search_vector"] def create_table_if_not_exists(engine, table): inspector = inspect(engine) - if not inspector.has_table(table.__tablename__): + if table and not inspector.has_table(table.__tablename__): table.__table__.create(engine) logger.info(f"Table '{table.__tablename__}' created.") else: @@ -109,12 +110,23 @@ warnings.simplefilter("always", exc.SAWarning) # Функция для извлечения SQL-запроса из контекста def get_statement_from_context(context): - if context is None or not hasattr(context, 'compiled'): - return None + query = '' compiled = context.compiled - if compiled is None or not hasattr(compiled, 'string'): - return None - return compiled.string + if compiled: + compiled_statement = compiled.string + compiled_parameters = compiled.params + if compiled_statement: + if compiled_parameters: + try: + # Безопасное форматирование параметров + query = compiled_statement % compiled_parameters + except Exception as e: + logger.error(f"Error formatting query: {e}") + else: + query = compiled_statement + if query: + query = query.replace("\n", " ").replace(" ", " ").replace(" ", " ").strip() + return query # Обработчик события перед выполнением запроса @@ -127,22 +139,15 @@ def before_cursor_execute(conn, cursor, statement, parameters, context, executem # Обработчик события после выполнения запроса @event.listens_for(Engine, "after_cursor_execute") def after_cursor_execute(conn, cursor, statement, parameters, context, executemany): - query = get_statement_from_context(context) - if query is not None: - logger.debug(query) - - -def create_tables_if_not_exist(engine, base): - inspector = inspect(engine) - for table_name, table in base.metadata.tables.items(): - try: - if not inspector.has_table(table_name): - table.create(engine) - logger.info(f"Table '{table_name}' created.") - else: - logger.info(f"Table '{table_name}' already exists.") - except Exception as e: - logger.error(f"Error while creating table '{table_name}': {str(e)}") - -# Заменяем Base.metadata.create_all(bind=engine) на: -create_tables_if_not_exist(engine, Base) + if hasattr(conn, "cursor_id") and conn.cursor_id == id(cursor): + query = get_statement_from_context(context) + if query: + elapsed = time.time() - conn.query_start_time + if elapsed > 1: + query_end = query[-16:] + query = query.split(query_end)[0] + query_end + logger.debug(query) + elapsed_n = math.floor(elapsed) + logger.debug('*' * (elapsed_n)) + logger.debug(f"{elapsed:.3f} s") + del conn.cursor_id # Удаление идентификатора курсора после выполнения