Spaces:
Build error
Build error
import os | |
import gradio as gr | |
from sqlalchemy import text | |
from smolagents import tool, CodeAgent, HfApiModel | |
import spaces | |
import pandas as pd | |
from database import ( | |
engine, | |
create_dynamic_table, | |
clear_database, | |
insert_rows_into_table, | |
get_table_schema | |
) | |
def process_sql_file(file_path): | |
""" | |
Process an SQL file and execute its contents. | |
""" | |
try: | |
# Read the SQL file | |
with open(file_path, 'r') as file: | |
sql_content = file.read() | |
# Replace AUTO_INCREMENT with AUTOINCREMENT for SQLite compatibility | |
sql_content = sql_content.replace('AUTO_INCREMENT', 'AUTOINCREMENT') | |
# Split into individual statements | |
statements = [stmt.strip() for stmt in sql_content.split(';') if stmt.strip()] | |
# Clear existing database | |
clear_database() | |
# Execute each statement | |
with engine.begin() as conn: | |
for statement in statements: | |
if statement.strip(): | |
conn.execute(text(statement)) | |
return True, "SQL file successfully executed! Click 'Continue' to proceed to query interface..." | |
except Exception as e: | |
return False, f"Error processing SQL file: {str(e)}" | |
# ... (other functions remain the same) ... | |
# Create the Gradio interface | |
with gr.Blocks() as demo: | |
# Upload Interface Components | |
with gr.Group() as upload_group: | |
gr.Markdown(""" | |
# Data Query Interface | |
Upload your data file to begin. | |
### Supported File Types: | |
- SQL (.sql): SQL file containing CREATE TABLE and INSERT statements | |
- CSV (.csv): CSV file with headers that will be automatically converted to a table | |
### CSV Requirements: | |
- Must include headers | |
- First column will be used as the primary key | |
- Column types will be automatically detected | |
### SQL Requirements: | |
- Must contain valid SQL statements | |
- Statements must be separated by semicolons | |
- Should include CREATE TABLE and data insertion statements | |
""") | |
file_input = gr.File( | |
label="Upload Data File", | |
file_types=[".csv", ".sql"], | |
type="filepath" | |
) | |
upload_status = gr.Textbox(label="Status", interactive=False) | |
continue_btn = gr.Button("Continue", visible=False) | |
# Query Interface Components | |
with gr.Group(visible=False) as query_group: | |
gr.Markdown("## Data Query Interface") | |
# Data Display Section | |
gr.Markdown("### Current Data") | |
data_table = gr.Dataframe( | |
value=get_data_table(), | |
label="Data Table", | |
interactive=False | |
) | |
schema_display = gr.Markdown(value="Loading schema...") | |
# Query Section | |
with gr.Row(): | |
with gr.Column(): | |
user_input = gr.Textbox( | |
label="Ask a question about the data", | |
placeholder="Enter your question here..." | |
) | |
query_output = gr.Textbox( | |
label="Result", | |
interactive=False | |
) | |
with gr.Row(): | |
refresh_table_btn = gr.Button("Refresh Table") | |
refresh_schema_btn = gr.Button("Refresh Schema") | |
back_btn = gr.Button("Upload New File") | |
def handle_upload(file): | |
success, message = process_uploaded_file(file) | |
if success: | |
df = get_data_table() | |
schema = get_table_schema() | |
return { | |
upload_status: message, | |
continue_btn: gr.update(visible=True), | |
data_table: df, | |
schema_display: f"### Current Schema:\n```\n{schema}\n```" if schema else "No schema available" | |
} | |
return { | |
upload_status: message, | |
continue_btn: gr.update(visible=False) | |
} | |
def switch_to_query(): | |
df = get_data_table() | |
schema = get_table_schema() | |
return { | |
upload_group: gr.update(visible=False), | |
query_group: gr.update(visible=True), | |
data_table: df, | |
schema_display: f"### Current Schema:\n```\n{schema}\n```" if schema else "No schema available" | |
} | |
def switch_to_upload(): | |
return { | |
upload_group: gr.update(visible=True), | |
query_group: gr.update(visible=False), | |
continue_btn: gr.update(visible=False), | |
upload_status: gr.update(value="") | |
} | |
# Event handlers | |
file_input.upload( | |
fn=handle_upload, | |
outputs=[ | |
upload_status, | |
continue_btn, | |
data_table, | |
schema_display | |
] | |
) | |
continue_btn.click( | |
fn=switch_to_query, | |
outputs=[ | |
upload_group, | |
query_group, | |
data_table, | |
schema_display | |
] | |
) | |
back_btn.click( | |
fn=switch_to_upload, | |
outputs=[ | |
upload_group, | |
query_group, | |
continue_btn, | |
upload_status | |
] | |
) | |
user_input.change( | |
fn=query_sql, | |
inputs=[user_input], | |
outputs=[query_output] | |
) | |
refresh_table_btn.click( | |
fn=get_data_table, | |
outputs=[data_table] | |
) | |
refresh_schema_btn.click( | |
fn=update_schema, | |
outputs=[schema_display] | |
) | |
if __name__ == "__main__": | |
demo.launch(server_name="0.0.0.0", server_port=7860) |