| | |
| | import streamlit as st |
| | import pandas as pd |
| | from sqlalchemy import create_engine, text |
| | import openai |
| | import os |
| |
|
| | |
| | |
| | openai.api_key = os.getenv("OPENAI_API_KEY") |
| |
|
| | |
| | DB_TYPE = "mysql+pymysql" |
| | DB_USER = "username" |
| | DB_PASS = "password" |
| | DB_HOST = "host" |
| | DB_PORT = "3306" |
| | DB_NAME = "db_name" |
| |
|
| | DATABASE_URL = f"{DB_TYPE}://{DB_USER}:{DB_PASS}@{DB_HOST}:{DB_PORT}/{DB_NAME}" |
| | engine = create_engine(DATABASE_URL) |
| |
|
| | |
| | def generate_sql(user_question, table_names=[]): |
| | """ |
| | Generates SQL query from user question using OpenAI GPT |
| | """ |
| | table_info = "" |
| | if table_names: |
| | table_info = f"These are your tables: {table_names}\n" |
| | |
| | prompt = f""" |
| | You are an expert SQL generator. |
| | {table_info} |
| | Write a SQL query that answers the following question: |
| | \"\"\"{user_question}\"\"\" |
| | Only return SQL, do not explain. |
| | """ |
| | response = openai.Completion.create( |
| | engine="text-davinci-003", |
| | prompt=prompt, |
| | temperature=0, |
| | max_tokens=300 |
| | ) |
| | sql_query = response.choices[0].text.strip() |
| | return sql_query |
| |
|
| | def run_query(sql_query): |
| | """ |
| | Runs SQL query using SQLAlchemy |
| | """ |
| | try: |
| | with engine.connect() as conn: |
| | result = pd.read_sql(text(sql_query), conn) |
| | return result |
| | except Exception as e: |
| | return f"Error executing query: {e}" |
| |
|
| | |
| | st.title("🧠 AI SQL Assistant") |
| | st.markdown("Ask a question about your database, and it will generate SQL and show results.") |
| |
|
| | user_question = st.text_input("Enter your question:") |
| |
|
| | if st.button("Run Query") and user_question: |
| | with st.spinner("Generating SQL..."): |
| | sql_query = generate_sql(user_question) |
| | st.code(sql_query, language="sql") |
| | |
| | with st.spinner("Executing SQL..."): |
| | result = run_query(sql_query) |
| | if isinstance(result, pd.DataFrame): |
| | st.success("Query executed successfully!") |
| | st.dataframe(result) |
| | else: |
| | st.error(result) |
| |
|