From 85792613b534c40183c1cc135311546582e86a5b Mon Sep 17 00:00:00 2001 From: jay817 Date: Sat, 21 Sep 2024 22:03:11 -0400 Subject: [PATCH] Add sqlite3-python/README.md --- sqlite3-python/README.md | 113 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 sqlite3-python/README.md diff --git a/sqlite3-python/README.md b/sqlite3-python/README.md new file mode 100644 index 0000000..4f73506 --- /dev/null +++ b/sqlite3-python/README.md @@ -0,0 +1,113 @@ +```python +class SQL: + def __init__(self, filename='db.sqlite'): + import sqlite3 + self.conn = sqlite3.connect(filename, + isolation_level=None # autocommit mode: ON + ) + self('PRAGMA journal_mode=WAL;') # WAL mode: ON + self.conn.row_factory = lambda *args: dict(sqlite3.Row(*args)) + + def __call__(self, *args): + import pandas as pd + return pd.DataFrame(self.conn.execute(*args)) + + def __getattr__(self, table): + return self(f"SELECT * FROM {table}") + + def __repr__(self): + return self("SELECT name FROM sqlite_master WHERE type='table'").to_string() +``` + +```python +# +try: get_ipython() +except: display = print + +sql = SQL() +sql + +# +# 학생 테이블 생성 +sql('''CREATE TABLE IF NOT EXISTS students + (id INTEGER PRIMARY KEY, name TEXT, age INTEGER, grade INTEGER)''') + +# 과목 테이블 생성 +sql('''CREATE TABLE IF NOT EXISTS courses + (id INTEGER PRIMARY KEY, name TEXT, professor TEXT)''') + +# 수강 테이블 생성 (학생과 과목의 관계) +sql('''CREATE TABLE IF NOT EXISTS enrollments + (student_id INTEGER, course_id INTEGER, + FOREIGN KEY(student_id) REFERENCES students(id), + FOREIGN KEY(course_id) REFERENCES courses(id))''') +sql + +# +# 학생 데이터 삽입 +sql('INSERT INTO students (name, age, grade) VALUES (?, ?, ?)', ('김철수', 20, 2)) +sql('INSERT INTO students (name, age, grade) VALUES (?, ?, ?)', ('이영희', 22, 4)) +sql('INSERT INTO students (name, age, grade) VALUES (?, ?, ?)', ('박민수', 19, 1)) + +# 과목 데이터 삽입 +sql('INSERT INTO courses (name, professor) VALUES (?, ?)', ('데이터베이스', '홍길동')) +sql('INSERT INTO courses (name, professor) VALUES (?, ?)', ('알고리즘', '이순신')) +sql('INSERT INTO courses (name, professor) VALUES (?, ?)', ('인공지능', '강감찬')) + +# 수강 데이터 삽입 +sql('INSERT INTO enrollments (student_id, course_id) VALUES (?, ?)', (1, 1)) +sql('INSERT INTO enrollments (student_id, course_id) VALUES (?, ?)', (1, 2)) +sql('INSERT INTO enrollments (student_id, course_id) VALUES (?, ?)', (2, 2)) +sql('INSERT INTO enrollments (student_id, course_id) VALUES (?, ?)', (3, 3)) + +print("Students:") +display(sql.students) +print("\nCourses:") +display(sql.courses) +print("\nEnrollments:") +display(sql.enrollments) + +# +# JOIN을 사용하여 학생별 수강 과목 조회 +print("\n학생별 수강 과목:") +enrollments_df = sql(''' + SELECT students.name AS student_name, courses.name AS course_name + FROM students + JOIN enrollments ON students.id = enrollments.student_id + JOIN courses ON enrollments.course_id = courses.id +''') +display(enrollments_df) + +# +# 특정 과목을 수강하는 학생 수 조회 +course_name = '알고리즘' +result = sql(''' + SELECT COUNT(*) as student_count + FROM enrollments + JOIN courses ON enrollments.course_id = courses.id + WHERE courses.name = ? +''', (course_name,)) +print(f"\n'{course_name}' 과목을 수강하는 학생 수: {result['student_count'].iloc[0]}") + +# +# 가장 많은 학생이 수강하는 과목 조회 +most_popular_course = sql(''' + SELECT courses.name, COUNT(*) as enrollment_count + FROM enrollments + JOIN courses ON enrollments.course_id = courses.id + GROUP BY courses.id + ORDER BY enrollment_count DESC + LIMIT 1 +''') +print(f"\n가장 인기 있는 과목: {most_popular_course['name'].iloc[0]} (수강생 {most_popular_course['enrollment_count'].iloc[0]}명)") + +# +# 최종 상태 출력 +print("\n최종 상태:") +print("Students:") +display(sql('SELECT * FROM students')) +print("\nCourses:") +display(sql('SELECT * FROM courses')) +print("\nEnrollments:") +display(sql('SELECT * FROM enrollments')) +``` \ No newline at end of file