Spaces:
Runtime error
Runtime error
| """SQL Service Module - Handles SQL query execution functionality.""" | |
| import pandas as pd | |
| import duckdb | |
| import logging | |
| from typing import Dict, Any, Optional, Union | |
| from io import StringIO | |
| logger = logging.getLogger(__name__) | |
| def execute_sql_query(df: pd.DataFrame, query: str) -> Dict[str, Any]: | |
| """ | |
| Execute a SQL query on the provided DataFrame using DuckDB. | |
| Args: | |
| df: Input DataFrame | |
| query: SQL query to execute | |
| Returns: | |
| Dictionary containing results and metadata | |
| """ | |
| try: | |
| # Register the DataFrame in DuckDB | |
| conn = duckdb.connect(':memory:') | |
| conn.register('df', df) | |
| # Execute the query | |
| result = conn.execute(query).fetchdf() | |
| # Close connection | |
| conn.close() | |
| return { | |
| 'success': True, | |
| 'result': result, | |
| 'row_count': len(result), | |
| 'column_count': len(result.columns), | |
| 'columns': list(result.columns) | |
| } | |
| except Exception as e: | |
| logger.error(f"SQL query execution failed: {e}") | |
| return { | |
| 'success': False, | |
| 'error': str(e), | |
| 'result': None | |
| } | |
| def get_table_schema(df: pd.DataFrame) -> str: | |
| """ | |
| Generate a table schema representation for SQL queries. | |
| Args: | |
| df: Input DataFrame | |
| Returns: | |
| String representation of the table schema | |
| """ | |
| buffer = StringIO() | |
| df.info(buf=buffer) | |
| schema_info = buffer.getvalue() | |
| return schema_info | |
| def validate_sql_syntax(query: str) -> bool: | |
| """ | |
| Basic validation of SQL syntax. | |
| Args: | |
| query: SQL query to validate | |
| Returns: | |
| Boolean indicating if syntax appears valid | |
| """ | |
| query = query.strip().lower() | |
| # Basic checks | |
| if not query: | |
| return False | |
| # Check if it starts with a valid SQL command | |
| valid_starts = ['select', 'with', 'insert', 'update', 'delete', 'create', 'alter', 'drop'] | |
| if not any(query.startswith(cmd) for cmd in valid_starts): | |
| return False | |
| # More sophisticated validation could be added here | |
| return True |