added l5
This commit is contained in:
538
g11-m3-m5/database.py
Normal file
538
g11-m3-m5/database.py
Normal file
@@ -0,0 +1,538 @@
|
|||||||
|
import sqlite3
|
||||||
|
import sys
|
||||||
|
|
||||||
|
def create_tables():
|
||||||
|
"""Create all core database tables"""
|
||||||
|
|
||||||
|
conn = sqlite3.connect('school_schedule.db')
|
||||||
|
cursor = conn.cursor()
|
||||||
|
|
||||||
|
# Drop tables if they exist (for testing)
|
||||||
|
tables = [
|
||||||
|
'students', 'teachers', 'subjects', 'rooms',
|
||||||
|
'classes', 'timeslots', 'schedule_entries',
|
||||||
|
'tech_tracks', 'english_levels', 'special_groups',
|
||||||
|
'users', 'audit_log'
|
||||||
|
]
|
||||||
|
|
||||||
|
for table in tables:
|
||||||
|
try:
|
||||||
|
cursor.execute(f"DROP TABLE IF EXISTS {table}")
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
# 1. Core Entities
|
||||||
|
cursor.execute('''
|
||||||
|
CREATE TABLE students (
|
||||||
|
student_id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
full_name TEXT NOT NULL,
|
||||||
|
date_of_birth DATE,
|
||||||
|
class_group TEXT,
|
||||||
|
emergency_contact TEXT,
|
||||||
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||||
|
)
|
||||||
|
''')
|
||||||
|
|
||||||
|
cursor.execute('''
|
||||||
|
CREATE TABLE teachers (
|
||||||
|
teacher_id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
full_name TEXT NOT NULL,
|
||||||
|
department TEXT,
|
||||||
|
email TEXT,
|
||||||
|
qualifications TEXT,
|
||||||
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||||
|
)
|
||||||
|
''')
|
||||||
|
|
||||||
|
cursor.execute('''
|
||||||
|
CREATE TABLE subjects (
|
||||||
|
subject_id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
subject_name TEXT NOT NULL,
|
||||||
|
department TEXT,
|
||||||
|
credits INTEGER,
|
||||||
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||||
|
)
|
||||||
|
''')
|
||||||
|
|
||||||
|
cursor.execute('''
|
||||||
|
CREATE TABLE rooms (
|
||||||
|
room_id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
room_number TEXT NOT NULL,
|
||||||
|
capacity INTEGER,
|
||||||
|
equipment TEXT,
|
||||||
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||||
|
)
|
||||||
|
''')
|
||||||
|
|
||||||
|
# 2. Academic Structure
|
||||||
|
cursor.execute('''
|
||||||
|
CREATE TABLE classes (
|
||||||
|
class_id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
class_name TEXT NOT NULL,
|
||||||
|
homeroom_teacher_id INTEGER,
|
||||||
|
academic_year TEXT,
|
||||||
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
FOREIGN KEY (homeroom_teacher_id) REFERENCES teachers(teacher_id)
|
||||||
|
)
|
||||||
|
''')
|
||||||
|
|
||||||
|
cursor.execute('''
|
||||||
|
CREATE TABLE tech_tracks (
|
||||||
|
track_id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
track_name TEXT NOT NULL,
|
||||||
|
description TEXT,
|
||||||
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||||
|
)
|
||||||
|
''')
|
||||||
|
|
||||||
|
cursor.execute('''
|
||||||
|
CREATE TABLE english_levels (
|
||||||
|
level_id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
level_code TEXT NOT NULL,
|
||||||
|
description TEXT,
|
||||||
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||||
|
)
|
||||||
|
''')
|
||||||
|
|
||||||
|
cursor.execute('''
|
||||||
|
CREATE TABLE special_groups (
|
||||||
|
group_id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
group_name TEXT NOT NULL,
|
||||||
|
group_type TEXT,
|
||||||
|
teacher_in_charge_id INTEGER,
|
||||||
|
max_participants INTEGER,
|
||||||
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
FOREIGN KEY (teacher_in_charge_id) REFERENCES teachers(teacher_id)
|
||||||
|
)
|
||||||
|
''')
|
||||||
|
|
||||||
|
# 3. Scheduling Core
|
||||||
|
cursor.execute('''
|
||||||
|
CREATE TABLE timeslots (
|
||||||
|
timeslot_id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
day_of_week TEXT NOT NULL,
|
||||||
|
period_number INTEGER,
|
||||||
|
start_time TIME NOT NULL,
|
||||||
|
end_time TIME NOT NULL,
|
||||||
|
academic_module TEXT,
|
||||||
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||||
|
)
|
||||||
|
''')
|
||||||
|
|
||||||
|
cursor.execute('''
|
||||||
|
CREATE TABLE schedule_entries (
|
||||||
|
entry_id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
student_id INTEGER NOT NULL,
|
||||||
|
teacher_id INTEGER NOT NULL,
|
||||||
|
subject_id INTEGER NOT NULL,
|
||||||
|
room_id INTEGER,
|
||||||
|
timeslot_id INTEGER NOT NULL,
|
||||||
|
academic_year TEXT NOT NULL,
|
||||||
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
FOREIGN KEY (student_id) REFERENCES students(student_id),
|
||||||
|
FOREIGN KEY (teacher_id) REFERENCES teachers(teacher_id),
|
||||||
|
FOREIGN KEY (subject_id) REFERENCES subjects(subject_id),
|
||||||
|
FOREIGN KEY (room_id) REFERENCES rooms(room_id),
|
||||||
|
FOREIGN KEY (timeslot_id) REFERENCES timeslots(timeslot_id)
|
||||||
|
)
|
||||||
|
''')
|
||||||
|
|
||||||
|
# 4. Security System
|
||||||
|
cursor.execute('''
|
||||||
|
CREATE TABLE users (
|
||||||
|
user_id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
username TEXT NOT NULL UNIQUE,
|
||||||
|
password_hash TEXT NOT NULL,
|
||||||
|
role TEXT NOT NULL,
|
||||||
|
email TEXT,
|
||||||
|
last_login TIMESTAMP,
|
||||||
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||||
|
)
|
||||||
|
''')
|
||||||
|
|
||||||
|
cursor.execute('''
|
||||||
|
CREATE TABLE audit_log (
|
||||||
|
log_id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
user_id INTEGER,
|
||||||
|
action TEXT NOT NULL,
|
||||||
|
table_name TEXT NOT NULL,
|
||||||
|
record_id INTEGER,
|
||||||
|
old_value TEXT,
|
||||||
|
new_value TEXT,
|
||||||
|
timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
FOREIGN KEY (user_id) REFERENCES users(user_id)
|
||||||
|
)
|
||||||
|
''')
|
||||||
|
|
||||||
|
# 5. Relationship tables
|
||||||
|
cursor.execute('''
|
||||||
|
CREATE TABLE student_subjects (
|
||||||
|
student_id INTEGER NOT NULL,
|
||||||
|
subject_id INTEGER NOT NULL,
|
||||||
|
PRIMARY KEY (student_id, subject_id),
|
||||||
|
FOREIGN KEY (student_id) REFERENCES students(student_id),
|
||||||
|
FOREIGN KEY (subject_id) REFERENCES subjects(subject_id)
|
||||||
|
)
|
||||||
|
''')
|
||||||
|
|
||||||
|
cursor.execute('''
|
||||||
|
CREATE TABLE student_tech_tracks (
|
||||||
|
student_id INTEGER NOT NULL,
|
||||||
|
track_id INTEGER NOT NULL,
|
||||||
|
PRIMARY KEY (student_id, track_id),
|
||||||
|
FOREIGN KEY (student_id) REFERENCES students(student_id),
|
||||||
|
FOREIGN KEY (track_id) REFERENCES tech_tracks(track_id)
|
||||||
|
)
|
||||||
|
''')
|
||||||
|
|
||||||
|
cursor.execute('''
|
||||||
|
CREATE TABLE student_english_levels (
|
||||||
|
student_id INTEGER NOT NULL,
|
||||||
|
level_id INTEGER NOT NULL,
|
||||||
|
PRIMARY KEY (student_id, level_id),
|
||||||
|
FOREIGN KEY (student_id) REFERENCES students(student_id),
|
||||||
|
FOREIGN KEY (level_id) REFERENCES english_levels(level_id)
|
||||||
|
)
|
||||||
|
''')
|
||||||
|
|
||||||
|
cursor.execute('''
|
||||||
|
CREATE TABLE student_groups (
|
||||||
|
student_id INTEGER NOT NULL,
|
||||||
|
group_id INTEGER NOT NULL,
|
||||||
|
PRIMARY KEY (student_id, group_id),
|
||||||
|
FOREIGN KEY (student_id) REFERENCES students(student_id),
|
||||||
|
FOREIGN KEY (group_id) REFERENCES special_groups(group_id)
|
||||||
|
)
|
||||||
|
''')
|
||||||
|
|
||||||
|
conn.commit()
|
||||||
|
print("✅ All tables created successfully!")
|
||||||
|
return conn
|
||||||
|
|
||||||
|
def insert_dummy_data(conn):
|
||||||
|
"""Insert sample data into all tables"""
|
||||||
|
|
||||||
|
cursor = conn.cursor()
|
||||||
|
|
||||||
|
# 1. Insert Teachers
|
||||||
|
teachers = [
|
||||||
|
('Ms. Johnson', 'Mathematics', 'johnson@school.edu', 'MSc Mathematics'),
|
||||||
|
('Mr. Smith', 'Science', 'smith@school.edu', 'PhD Physics'),
|
||||||
|
('Ms. Davis', 'English', 'davis@school.edu', 'MA English Literature'),
|
||||||
|
('Mr. Wilson', 'Technology', 'wilson@school.edu', 'BSc Computer Science'),
|
||||||
|
('Ms. Garcia', 'Arts', 'garcia@school.edu', 'MFA Visual Arts')
|
||||||
|
]
|
||||||
|
|
||||||
|
cursor.executemany('''
|
||||||
|
INSERT INTO teachers (full_name, department, email, qualifications)
|
||||||
|
VALUES (?, ?, ?, ?)
|
||||||
|
''', teachers)
|
||||||
|
|
||||||
|
# 2. Insert Students
|
||||||
|
students = [
|
||||||
|
('Alex Chen', '2009-03-15', '4A', '+1-555-0101'),
|
||||||
|
('Sofia Rodriguez', '2009-07-22', '4A', '+1-555-0102'),
|
||||||
|
('James Wilson', '2009-01-10', '4B', '+1-555-0103'),
|
||||||
|
('Maya Patel', '2009-11-30', '4B', '+1-555-0104'),
|
||||||
|
('Ethan Brown', '2009-05-18', '4C', '+1-555-0105'),
|
||||||
|
('Isabella Kim', '2009-09-05', '4C', '+1-555-0106')
|
||||||
|
]
|
||||||
|
|
||||||
|
cursor.executemany('''
|
||||||
|
INSERT INTO students (full_name, date_of_birth, class_group, emergency_contact)
|
||||||
|
VALUES (?, ?, ?, ?)
|
||||||
|
''', students)
|
||||||
|
|
||||||
|
# 3. Insert Subjects
|
||||||
|
subjects = [
|
||||||
|
('Mathematics', 'STEM', 4),
|
||||||
|
('Physics', 'STEM', 4),
|
||||||
|
('English Language', 'Languages', 4),
|
||||||
|
('Computer Science', 'STEM', 3),
|
||||||
|
('Art', 'Arts', 2),
|
||||||
|
('Physical Education', 'Sports', 2)
|
||||||
|
]
|
||||||
|
|
||||||
|
cursor.executemany('''
|
||||||
|
INSERT INTO subjects (subject_name, department, credits)
|
||||||
|
VALUES (?, ?, ?)
|
||||||
|
''', subjects)
|
||||||
|
|
||||||
|
# 4. Insert Rooms
|
||||||
|
rooms = [
|
||||||
|
('204', 30, 'Projector, Whiteboard'),
|
||||||
|
('105', 25, 'Lab Equipment, Computers'),
|
||||||
|
('312', 35, 'Whiteboard, Audio System'),
|
||||||
|
('101', 20, 'Art Supplies, Easels'),
|
||||||
|
('Gym', 100, 'Sports Equipment'),
|
||||||
|
('Library', 50, 'Computers, Books')
|
||||||
|
]
|
||||||
|
|
||||||
|
cursor.executemany('''
|
||||||
|
INSERT INTO rooms (room_number, capacity, equipment)
|
||||||
|
VALUES (?, ?, ?)
|
||||||
|
''', rooms)
|
||||||
|
|
||||||
|
# 5. Insert Classes
|
||||||
|
classes = [
|
||||||
|
('4A', 1, '2025-2026'),
|
||||||
|
('4B', 2, '2025-2026'),
|
||||||
|
('4C', 3, '2025-2026')
|
||||||
|
]
|
||||||
|
|
||||||
|
cursor.executemany('''
|
||||||
|
INSERT INTO classes (class_name, homeroom_teacher_id, academic_year)
|
||||||
|
VALUES (?, ?, ?)
|
||||||
|
''', classes)
|
||||||
|
|
||||||
|
# 6. Insert Tech Tracks
|
||||||
|
tech_tracks = [
|
||||||
|
('Design & Creativity', 'Graphic design, product design'),
|
||||||
|
('Culinary Arts', 'Cooking, baking, food science'),
|
||||||
|
('Industrial Technology', 'Engineering, manufacturing')
|
||||||
|
]
|
||||||
|
|
||||||
|
cursor.executemany('''
|
||||||
|
INSERT INTO tech_tracks (track_name, description)
|
||||||
|
VALUES (?, ?)
|
||||||
|
''', tech_tracks)
|
||||||
|
|
||||||
|
# 7. Insert English Levels
|
||||||
|
english_levels = [
|
||||||
|
('E1', 'Beginner English'),
|
||||||
|
('E2', 'Elementary English'),
|
||||||
|
('E3', 'Pre-Intermediate'),
|
||||||
|
('E4', 'Intermediate'),
|
||||||
|
('E5', 'Upper-Intermediate'),
|
||||||
|
('E6', 'Advanced')
|
||||||
|
]
|
||||||
|
|
||||||
|
cursor.executemany('''
|
||||||
|
INSERT INTO english_levels (level_code, description)
|
||||||
|
VALUES (?, ?)
|
||||||
|
''', english_levels)
|
||||||
|
|
||||||
|
# 8. Insert Special Groups
|
||||||
|
special_groups = [
|
||||||
|
('Math Olympiad', 'Competition', 1, 15),
|
||||||
|
('Science Club', 'Club', 2, 20),
|
||||||
|
('Debate Team', 'Competition', 3, 10),
|
||||||
|
('Robotics Club', 'Club', 4, 12)
|
||||||
|
]
|
||||||
|
|
||||||
|
cursor.executemany('''
|
||||||
|
INSERT INTO special_groups (group_name, group_type, teacher_in_charge_id, max_participants)
|
||||||
|
VALUES (?, ?, ?, ?)
|
||||||
|
''', special_groups)
|
||||||
|
|
||||||
|
# 9. Insert Timeslots
|
||||||
|
timeslots = [
|
||||||
|
('Monday', 1, '08:30', '09:15', 'Module 1'),
|
||||||
|
('Monday', 2, '09:20', '10:05', 'Module 1'),
|
||||||
|
('Monday', 3, '10:30', '11:15', 'Module 1'),
|
||||||
|
('Monday', 4, '11:20', '12:05', 'Module 1'),
|
||||||
|
('Tuesday', 1, '08:30', '09:15', 'Module 1'),
|
||||||
|
('Tuesday', 2, '09:20', '10:05', 'Module 1'),
|
||||||
|
('Wednesday', 1, '08:30', '09:15', 'Module 1'),
|
||||||
|
('Thursday', 1, '08:30', '09:15', 'Module 1'),
|
||||||
|
('Friday', 1, '08:30', '09:15', 'Module 1')
|
||||||
|
]
|
||||||
|
|
||||||
|
cursor.executemany('''
|
||||||
|
INSERT INTO timeslots (day_of_week, period_number, start_time, end_time, academic_module)
|
||||||
|
VALUES (?, ?, ?, ?, ?)
|
||||||
|
''', timeslots)
|
||||||
|
|
||||||
|
# 10. Insert Schedule Entries
|
||||||
|
schedule_entries = [
|
||||||
|
(1, 1, 1, 1, 1, '2025-2026'), # Alex, Ms. Johnson, Math, Room 204, Monday 8:30
|
||||||
|
(2, 2, 3, 2, 2, '2025-2026'), # Sofia, Mr. Smith, English, Room 105, Monday 9:20
|
||||||
|
(3, 3, 2, 3, 3, '2025-2026'), # James, Ms. Davis, Physics, Room 312, Monday 10:30
|
||||||
|
(4, 4, 4, 4, 4, '2025-2026'), # Maya, Mr. Wilson, CS, Room 101, Monday 11:20
|
||||||
|
(5, 5, 5, 5, 5, '2025-2026'), # Ethan, Ms. Garcia, Art, Gym, Tuesday 8:30
|
||||||
|
(6, 1, 6, 6, 6, '2025-2026') # Isabella, Ms. Johnson, PE, Library, Tuesday 9:20
|
||||||
|
]
|
||||||
|
|
||||||
|
cursor.executemany('''
|
||||||
|
INSERT INTO schedule_entries (student_id, teacher_id, subject_id, room_id, timeslot_id, academic_year)
|
||||||
|
VALUES (?, ?, ?, ?, ?, ?)
|
||||||
|
''', schedule_entries)
|
||||||
|
|
||||||
|
# 11. Insert Relationship Data
|
||||||
|
# Student-Subject relationships (students taking multiple subjects)
|
||||||
|
student_subjects = [
|
||||||
|
(1, 1), (1, 2), (1, 3), # Alex takes Math, Physics, English
|
||||||
|
(2, 1), (2, 4), (2, 5), # Sofia takes Math, CS, Art
|
||||||
|
(3, 2), (3, 3), (3, 6), # James takes Physics, English, PE
|
||||||
|
(4, 4), (4, 5), (4, 6), # Maya takes CS, Art, PE
|
||||||
|
(5, 1), (5, 2), (5, 4), # Ethan takes Math, Physics, CS
|
||||||
|
(6, 3), (6, 5), (6, 6) # Isabella takes English, Art, PE
|
||||||
|
]
|
||||||
|
|
||||||
|
cursor.executemany('''
|
||||||
|
INSERT INTO student_subjects (student_id, subject_id)
|
||||||
|
VALUES (?, ?)
|
||||||
|
''', student_subjects)
|
||||||
|
|
||||||
|
# Student-Tech Track relationships
|
||||||
|
student_tech_tracks = [
|
||||||
|
(1, 1), # Alex in Design
|
||||||
|
(2, 2), # Sofia in Culinary
|
||||||
|
(3, 3), # James in Industrial
|
||||||
|
(4, 1), # Maya in Design
|
||||||
|
(5, 2), # Ethan in Culinary
|
||||||
|
(6, 3) # Isabella in Industrial
|
||||||
|
]
|
||||||
|
|
||||||
|
cursor.executemany('''
|
||||||
|
INSERT INTO student_tech_tracks (student_id, track_id)
|
||||||
|
VALUES (?, ?)
|
||||||
|
''', student_tech_tracks)
|
||||||
|
|
||||||
|
# Student-English Level relationships
|
||||||
|
student_english_levels = [
|
||||||
|
(1, 4), # Alex in E4
|
||||||
|
(2, 5), # Sofia in E5
|
||||||
|
(3, 3), # James in E3
|
||||||
|
(4, 6), # Maya in E6
|
||||||
|
(5, 2), # Ethan in E2
|
||||||
|
(6, 4) # Isabella in E4
|
||||||
|
]
|
||||||
|
|
||||||
|
cursor.executemany('''
|
||||||
|
INSERT INTO student_english_levels (student_id, level_id)
|
||||||
|
VALUES (?, ?)
|
||||||
|
''', student_english_levels)
|
||||||
|
|
||||||
|
# Student-Group relationships
|
||||||
|
student_groups = [
|
||||||
|
(1, 1), (1, 3), # Alex in Math Olympiad & Debate
|
||||||
|
(2, 2), (2, 4), # Sofia in Science & Robotics
|
||||||
|
(3, 1), (3, 4), # James in Math Olympiad & Robotics
|
||||||
|
(4, 2), (4, 3), # Maya in Science & Debate
|
||||||
|
(5, 1), # Ethan in Math Olympiad
|
||||||
|
(6, 2), (6, 4) # Isabella in Science & Robotics
|
||||||
|
]
|
||||||
|
|
||||||
|
cursor.executemany('''
|
||||||
|
INSERT INTO student_groups (student_id, group_id)
|
||||||
|
VALUES (?, ?)
|
||||||
|
''', student_groups)
|
||||||
|
|
||||||
|
# 12. Insert Users
|
||||||
|
users = [
|
||||||
|
('admin', 'hashed_password_123', 'administrator', 'admin@school.edu'),
|
||||||
|
('teacher1', 'hashed_password_456', 'teacher', 'johnson@school.edu'),
|
||||||
|
('teacher2', 'hashed_password_789', 'teacher', 'smith@school.edu'),
|
||||||
|
('student1', 'hashed_password_abc', 'student', 'alex@school.edu')
|
||||||
|
]
|
||||||
|
|
||||||
|
cursor.executemany('''
|
||||||
|
INSERT INTO users (username, password_hash, role, email)
|
||||||
|
VALUES (?, ?, ?, ?)
|
||||||
|
''', users)
|
||||||
|
|
||||||
|
conn.commit()
|
||||||
|
print("✅ Dummy data inserted successfully!")
|
||||||
|
|
||||||
|
# Show table counts
|
||||||
|
tables = ['students', 'teachers', 'subjects', 'rooms', 'classes',
|
||||||
|
'tech_tracks', 'english_levels', 'special_groups',
|
||||||
|
'timeslots', 'schedule_entries', 'users']
|
||||||
|
|
||||||
|
print("\n📊 Database Statistics:")
|
||||||
|
for table in tables:
|
||||||
|
cursor.execute(f"SELECT COUNT(*) FROM {table}")
|
||||||
|
count = cursor.fetchone()[0]
|
||||||
|
print(f" {table}: {count} records")
|
||||||
|
|
||||||
|
def main():
|
||||||
|
"""Main function to create database and insert data"""
|
||||||
|
print("🏫 School Schedule Database Setup")
|
||||||
|
print("=" * 40)
|
||||||
|
|
||||||
|
try:
|
||||||
|
# Create database and tables
|
||||||
|
conn = create_tables()
|
||||||
|
|
||||||
|
# Insert dummy data
|
||||||
|
insert_dummy_data(conn)
|
||||||
|
|
||||||
|
# Test queries
|
||||||
|
cursor = conn.cursor()
|
||||||
|
|
||||||
|
print("\n🔍 Sample Queries:")
|
||||||
|
print("=" * 40)
|
||||||
|
|
||||||
|
# Query 1: Get student schedule
|
||||||
|
print("\n1. Alex Chen's Schedule:")
|
||||||
|
cursor.execute('''
|
||||||
|
SELECT s.full_name, t.full_name as teacher, sub.subject_name,
|
||||||
|
r.room_number, ts.day_of_week, ts.start_time, ts.end_time
|
||||||
|
FROM schedule_entries se
|
||||||
|
JOIN students s ON se.student_id = s.student_id
|
||||||
|
JOIN teachers t ON se.teacher_id = t.teacher_id
|
||||||
|
JOIN subjects sub ON se.subject_id = sub.subject_id
|
||||||
|
JOIN rooms r ON se.room_id = r.room_id
|
||||||
|
JOIN timeslots ts ON se.timeslot_id = ts.timeslot_id
|
||||||
|
WHERE s.full_name = 'Alex Chen'
|
||||||
|
ORDER BY ts.day_of_week, ts.start_time
|
||||||
|
''')
|
||||||
|
|
||||||
|
for row in cursor.fetchall():
|
||||||
|
print(f" {row[0]} has {row[2]} with {row[1]} in Room {row[3]} on {row[4]} {row[5]}-{row[6]}")
|
||||||
|
|
||||||
|
# Query 2: Count students in each group
|
||||||
|
print("\n2. Group Participation:")
|
||||||
|
cursor.execute('''
|
||||||
|
SELECT sg.group_name, COUNT(sg.student_id) as student_count
|
||||||
|
FROM student_groups sg
|
||||||
|
JOIN special_groups g ON sg.group_id = g.group_id
|
||||||
|
GROUP BY g.group_name
|
||||||
|
ORDER BY student_count DESC
|
||||||
|
''')
|
||||||
|
|
||||||
|
for row in cursor.fetchall():
|
||||||
|
print(f" {row[0]}: {row[1]} students")
|
||||||
|
|
||||||
|
# Query 3: Find available rooms at a specific time
|
||||||
|
print("\n3. Room 204 Schedule on Monday:")
|
||||||
|
cursor.execute('''
|
||||||
|
SELECT ts.start_time, ts.end_time, t.full_name as teacher,
|
||||||
|
s.full_name as student, sub.subject_name
|
||||||
|
FROM schedule_entries se
|
||||||
|
JOIN timeslots ts ON se.timeslot_id = ts.timeslot_id
|
||||||
|
JOIN teachers t ON se.teacher_id = t.teacher_id
|
||||||
|
JOIN students s ON se.student_id = s.student_id
|
||||||
|
JOIN subjects sub ON se.subject_id = sub.subject_id
|
||||||
|
JOIN rooms r ON se.room_id = r.room_id
|
||||||
|
WHERE r.room_number = '204' AND ts.day_of_week = 'Monday'
|
||||||
|
ORDER BY ts.start_time
|
||||||
|
''')
|
||||||
|
|
||||||
|
for row in cursor.fetchall():
|
||||||
|
print(f" {row[0]}-{row[1]}: {row[2]} teaching {row[4]} to {row[3]}")
|
||||||
|
|
||||||
|
# Save SQL file
|
||||||
|
print("\n💾 Exporting SQL statements to 'database_setup.sql'...")
|
||||||
|
with open('database_setup.sql', 'w') as f:
|
||||||
|
# Get schema
|
||||||
|
cursor.execute("SELECT sql FROM sqlite_master WHERE type='table'")
|
||||||
|
for row in cursor.fetchall():
|
||||||
|
f.write(row[0] + ";\n\n")
|
||||||
|
|
||||||
|
# Get data (simplified)
|
||||||
|
f.write("-- Sample INSERT statements would go here\n")
|
||||||
|
|
||||||
|
print("✅ Database setup complete!")
|
||||||
|
print(f"📁 Database file: school_schedule.db")
|
||||||
|
print(f"📄 SQL file: database_setup.sql")
|
||||||
|
|
||||||
|
conn.close()
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print(f"❌ Error: {e}")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
162
g11-m3-m5/database_setup.sql
Normal file
162
g11-m3-m5/database_setup.sql
Normal file
@@ -0,0 +1,162 @@
|
|||||||
|
-- database_setup.sql
|
||||||
|
-- Core Tables Creation
|
||||||
|
|
||||||
|
-- 1. Students Table
|
||||||
|
CREATE TABLE students (
|
||||||
|
student_id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
full_name TEXT NOT NULL,
|
||||||
|
date_of_birth DATE,
|
||||||
|
class_group TEXT,
|
||||||
|
emergency_contact TEXT,
|
||||||
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||||
|
);
|
||||||
|
|
||||||
|
-- 2. Teachers Table
|
||||||
|
CREATE TABLE teachers (
|
||||||
|
teacher_id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
full_name TEXT NOT NULL,
|
||||||
|
department TEXT,
|
||||||
|
email TEXT,
|
||||||
|
qualifications TEXT,
|
||||||
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||||
|
);
|
||||||
|
|
||||||
|
-- 3. Subjects Table
|
||||||
|
CREATE TABLE subjects (
|
||||||
|
subject_id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
subject_name TEXT NOT NULL,
|
||||||
|
department TEXT,
|
||||||
|
credits INTEGER,
|
||||||
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||||
|
);
|
||||||
|
|
||||||
|
-- 4. Rooms Table
|
||||||
|
CREATE TABLE rooms (
|
||||||
|
room_id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
room_number TEXT NOT NULL,
|
||||||
|
capacity INTEGER,
|
||||||
|
equipment TEXT,
|
||||||
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||||
|
);
|
||||||
|
|
||||||
|
-- 5. Classes Table
|
||||||
|
CREATE TABLE classes (
|
||||||
|
class_id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
class_name TEXT NOT NULL,
|
||||||
|
homeroom_teacher_id INTEGER,
|
||||||
|
academic_year TEXT,
|
||||||
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
FOREIGN KEY (homeroom_teacher_id) REFERENCES teachers(teacher_id)
|
||||||
|
);
|
||||||
|
|
||||||
|
-- 6. Tech Tracks Table
|
||||||
|
CREATE TABLE tech_tracks (
|
||||||
|
track_id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
track_name TEXT NOT NULL,
|
||||||
|
description TEXT,
|
||||||
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||||
|
);
|
||||||
|
|
||||||
|
-- 7. English Levels Table
|
||||||
|
CREATE TABLE english_levels (
|
||||||
|
level_id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
level_code TEXT NOT NULL,
|
||||||
|
description TEXT,
|
||||||
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||||
|
);
|
||||||
|
|
||||||
|
-- 8. Special Groups Table
|
||||||
|
CREATE TABLE special_groups (
|
||||||
|
group_id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
group_name TEXT NOT NULL,
|
||||||
|
group_type TEXT,
|
||||||
|
teacher_in_charge_id INTEGER,
|
||||||
|
max_participants INTEGER,
|
||||||
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
FOREIGN KEY (teacher_in_charge_id) REFERENCES teachers(teacher_id)
|
||||||
|
);
|
||||||
|
|
||||||
|
-- 9. Timeslots Table
|
||||||
|
CREATE TABLE timeslots (
|
||||||
|
timeslot_id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
day_of_week TEXT NOT NULL,
|
||||||
|
period_number INTEGER,
|
||||||
|
start_time TIME NOT NULL,
|
||||||
|
end_time TIME NOT NULL,
|
||||||
|
academic_module TEXT,
|
||||||
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||||
|
);
|
||||||
|
|
||||||
|
-- 10. Schedule Entries Table (Core Connection Table)
|
||||||
|
CREATE TABLE schedule_entries (
|
||||||
|
entry_id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
student_id INTEGER NOT NULL,
|
||||||
|
teacher_id INTEGER NOT NULL,
|
||||||
|
subject_id INTEGER NOT NULL,
|
||||||
|
room_id INTEGER,
|
||||||
|
timeslot_id INTEGER NOT NULL,
|
||||||
|
academic_year TEXT NOT NULL,
|
||||||
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
FOREIGN KEY (student_id) REFERENCES students(student_id),
|
||||||
|
FOREIGN KEY (teacher_id) REFERENCES teachers(teacher_id),
|
||||||
|
FOREIGN KEY (subject_id) REFERENCES subjects(subject_id),
|
||||||
|
FOREIGN KEY (room_id) REFERENCES rooms(room_id),
|
||||||
|
FOREIGN KEY (timeslot_id) REFERENCES timeslots(timeslot_id)
|
||||||
|
);
|
||||||
|
|
||||||
|
-- 11. Users Table (Security)
|
||||||
|
CREATE TABLE users (
|
||||||
|
user_id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
username TEXT NOT NULL UNIQUE,
|
||||||
|
password_hash TEXT NOT NULL,
|
||||||
|
role TEXT NOT NULL,
|
||||||
|
email TEXT,
|
||||||
|
last_login TIMESTAMP,
|
||||||
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||||
|
);
|
||||||
|
|
||||||
|
-- 12. Audit Log Table
|
||||||
|
CREATE TABLE audit_log (
|
||||||
|
log_id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
user_id INTEGER,
|
||||||
|
action TEXT NOT NULL,
|
||||||
|
table_name TEXT NOT NULL,
|
||||||
|
record_id INTEGER,
|
||||||
|
old_value TEXT,
|
||||||
|
new_value TEXT,
|
||||||
|
timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
FOREIGN KEY (user_id) REFERENCES users(user_id)
|
||||||
|
);
|
||||||
|
|
||||||
|
-- 13. Relationship Tables
|
||||||
|
CREATE TABLE student_subjects (
|
||||||
|
student_id INTEGER NOT NULL,
|
||||||
|
subject_id INTEGER NOT NULL,
|
||||||
|
PRIMARY KEY (student_id, subject_id),
|
||||||
|
FOREIGN KEY (student_id) REFERENCES students(student_id),
|
||||||
|
FOREIGN KEY (subject_id) REFERENCES subjects(subject_id)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE student_tech_tracks (
|
||||||
|
student_id INTEGER NOT NULL,
|
||||||
|
track_id INTEGER NOT NULL,
|
||||||
|
PRIMARY KEY (student_id, track_id),
|
||||||
|
FOREIGN KEY (student_id) REFERENCES students(student_id),
|
||||||
|
FOREIGN KEY (track_id) REFERENCES tech_tracks(track_id)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE student_english_levels (
|
||||||
|
student_id INTEGER NOT NULL,
|
||||||
|
level_id INTEGER NOT NULL,
|
||||||
|
PRIMARY KEY (student_id, level_id),
|
||||||
|
FOREIGN KEY (student_id) REFERENCES students(student_id),
|
||||||
|
FOREIGN KEY (level_id) REFERENCES english_levels(level_id)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE student_groups (
|
||||||
|
student_id INTEGER NOT NULL,
|
||||||
|
group_id INTEGER NOT NULL,
|
||||||
|
PRIMARY KEY (student_id, group_id),
|
||||||
|
FOREIGN KEY (student_id) REFERENCES students(student_id),
|
||||||
|
FOREIGN KEY (group_id) REFERENCES special_groups(group_id)
|
||||||
|
);
|
||||||
Reference in New Issue
Block a user