Files
wiki/sqlite3-python
..
2024-09-15 11:04:57 +00:00
2024-09-25 11:37:32 -04:00
2024-09-15 11:04:57 +00:00

Best

def SQL(db='sql.db'):
    import sqlite3, pandas as pd
    conn = sqlite3.connect(db, isolation_level=None)
    conn.execute('PRAGMA journal_mode=WAL')
    conn.row_factory = sqlite3.Row
    return lambda *args: pd.DataFrame(dict(row) for row in conn.execute(*args))
sql = SQL()

Simplest

def SQL():
    sql = __import__('sqlite3').connect('sql.db', isolation_level=None).execute
    sql('PRAGMA journal_mode=WAL'); return lambda *args: list(sql(*args))
sql = SQL()

Simple

def SQL():
    sql = __import__('sqlite3').connect('sql.db', isolation_level=None).execute
    sql('PRAGMA journal_mode = WAL')
    sql('CREATE TABLE IF NOT EXISTS dict (key PRIMARY KEY, value)')
    return type('', (), dict(__call__=lambda _, *args: list(sql(*args)),
    __setitem__=lambda _, *kv:sql('INSERT OR REPLACE INTO dict VALUES(?,?)',kv),
    __getitem__=lambda sql,*k:sql('SELECT * FROM dict WHERE key=?', k)[0][1]))()
#
sql = SQL()
sql[4] = 2
print(sql[4]) # 2

Class

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()
#%%
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'))