File size: 2,641 Bytes
a1ea7ff
3582fbc
 
33972db
3582fbc
 
cfb1fec
 
3582fbc
cfb1fec
 
3582fbc
cfb1fec
 
 
3582fbc
cfb1fec
33972db
3582fbc
cfb1fec
33972db
 
 
3582fbc
33972db
a1ea7ff
cfb1fec
33972db
 
cfb1fec
33972db
cfb1fec
 
 
33972db
cfb1fec
33972db
 
 
cfb1fec
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
33972db
cfb1fec
 
33972db
cfb1fec
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
import streamlit as st
import pandas as pd
import sqlite3
import os
from database import initialize_database

# Initialize database (set clear_data=True to reset data)
initialize_database(clear_data=False)

# Database path
db_path = os.path.abspath(os.path.join(os.path.dirname(__file__), "../college.db"))

# App layout
st.set_page_config(page_title="College Dashboard", layout="wide")
st.title("πŸ“Š College Dynamic Dashboard")

# Sidebar: select table
table = st.sidebar.selectbox("Select Table", ["student", "employee", "course"])

# Load data function
def load_data(table):
    conn = sqlite3.connect(db_path)
    df = pd.read_sql_query(f"SELECT * FROM {table}", conn)
    conn.close()
    return df

# Filter data function
def filter_data(df):
    col = st.sidebar.selectbox("Select column to filter", df.columns)
    unique_values = df[col].dropna().unique().tolist()
    selected = st.sidebar.multiselect(f"Filter {col}", unique_values, default=unique_values)
    if selected:
        return df[df[col].isin(selected)]
    return df

# Load and filter data
df = load_data(table)
filtered_df = filter_data(df)

# Display filtered data
st.subheader(f"πŸ“„ {table.capitalize()} Table")
st.dataframe(filtered_df, use_container_width=True)

# Quick insights & charts
st.markdown("### πŸ“ˆ Quick Insights")
if table == "student":
    st.metric("Total Students", len(filtered_df))
    if "major" in filtered_df.columns:
        st.bar_chart(filtered_df['major'].value_counts())
elif table == "employee":
    st.metric("Total Employees", len(filtered_df))
    if "department" in filtered_df.columns:
        st.bar_chart(filtered_df['department'].value_counts())
elif table == "course":
    st.metric("Total Courses", len(filtered_df))
    if "semester" in filtered_df.columns:
        st.bar_chart(filtered_df['semester'].value_counts())

# Custom SQL query
st.markdown("### πŸ” Run Custom SQL Query")
sql_query = st.text_area("Enter your SQL Query below:", height=150)

if st.button("Execute Query"):
    # Basic SQL safety check
    restricted_keywords = ["drop", "delete", "update", "insert", "alter", "create", "pragma"]
    if any(keyword in sql_query.lower() for keyword in restricted_keywords):
        st.warning("🚫 Restricted SQL keywords detected. Only SELECT queries are allowed.")
    else:
        try:
            conn = sqlite3.connect(db_path)
            result_df = pd.read_sql_query(sql_query, conn)
            conn.close()
            st.success("βœ… Query executed successfully.")
            st.dataframe(result_df, use_container_width=True)
        except Exception as e:
            st.error(f"❌ Error: {e}")