티스토리 뷰

반응형

0. 지난 포스트

지난 포스트는 SQLite 데이터를  파이썬의 데이터프레임(pandas-dataframe)으로 읽어 오는 방법에 대해서 알아보았습니다. 이번 포스트에는 파이썬에서 SQLite를 다루는 방법에 대해 집중적으로  알아보겠습니다. 

 

https://dataleader.tistory.com/44

 

[파이썬(Python) 이야기 9화] SQLite 연결하고 데이터 프레임으로 읽기(Pandas)

0. SQLite란? 이해하기 쉽게 설명하면 SQLite는 파일형 데이터베이스 입니다. 데이터베이스라서 쿼리를 사용할 수 있어, 다양한 데이터 처리를 할 수 있습니다. 다량의 데이터도 컴퓨터의 자원이 허

dataleader.tistory.com

 

1. Cursor 인터페이스

판다스를 통헤 read_sql를 이용할 경우에는  Cursor  인터페이스를 사용 할 필요가 없었습니다. 하지만 순수 파이썬과 데이터베이스 간의 데이터를 주고 받기 위해선 반드시 Cursor 인터페이스를 사용해야만 합니다. 


Cursor 인터페이스는  쿼리실행(execute), 결과검색(fetch), 매게변수 전달, 트랙잭션 관리 그리고 에러 처리를 수행할 수 있습니다.  Cusor 인터페이스를 통해 데이터베이스에 쿼리를 실행하는 예는 아래와 같습니다. 

 

이전의 데이터프레임으로 읽는 것과 큰 차이는 없지만, Row 단위로 처리를 한다는 것이 큰 차이입니다. 

 

이 경우 Row 단위로 특정 전처리를 손쉽게 할 수 있는 장점이 있습니다.

import sqlite3

filepath = "D:/SQLite/news_sqlite.sqlite"
with sqlite3.connect(filepath) as conn :
    cursorDB = conn.execute("SELECT * FROM newsMain")
    rows = cursorDB.fetchall()

    for row in rows[:10] :
        print(row)

fetchall, fetchone, fetchmany의 차이는?

[fetchall] fetchall은 리스트 형식으로 쿼리의 결과를 한번에 가져오게 됩니다. 

 

[fechone] 이와 반대로  fetchone은 한 줄씩 가져와 값을  처리를 하는 방식 입니다. fetchone의 경우 끝에 도달하게 되면 None를 반환합니다.

 

[fetchmeny ]마지막으로 fetchmeny의 경우는 지정된 숫자만큼 행을 가져옮니다.

 

cursor.execute('SELECT id, name, email FROM users')
# 모든 결과 행 가져오기
rows = cursor.fetchall()
# 각 행 출력
for row in rows:
    print(row)
# 첫 번째 결과 행 가져오기
first_row = cursor.fetchone()
print(first_row)

# 두 번째 결과 행 가져오기
second_row = cursor.fetchone()
print(second_row)

# 다음 3개의 결과 행 가져오기
next_three_rows = cursor.fetchmany(3)
print(next_three_rows)

 

 그렇다면 각각의 장점과 단점을 어떤 것일까요? 

구 분 fetchall fetchone fetchmany
장점 모든 결과 행을 한 번에 가져올 수 있음.  결과 집합에서 다음 행을 순차적으로 가져올 수 있어, 메모리의  사용량 제어가 가능 지정된 개수만큼의 결과 행을 한 번에 가져올 수 있어, 효율적으로 결과를 처리할 수 있음
단점 결과 집합이 매우 큰 경우에는 메모리 사용량이 증가하여 성능 이슈가 발생함  대량의 데이터를 다룰 때는 부적합 결과를 하나씩 가져오기 때문에, 결과 처리를 위해 반복문을 사용이 필수, 처리 속도가 fetchall에 비해 상대적으로 느림 개수를 지정해야 하므로, 정확한 개수를 파악하기 어려울 경우에는 사용하기 어려울 수 있음

 

2. Pameter 처리

Cursor 인터페이스를 사용하면, 쿼리의  Parameter도 정말  손쉽게 처리할 수 있습니다. 특히 저의 경우에는 데이터를 INSERT할 때 해당 이 기법을 종종 사용합니다. 아래 코드는 위의 예시에서 WHERE 문을 Parameter로 처리한 코드입니다. 

filepath = "D:/SQLite/news_sqlite.sqlite"
with sqlite3.connect(filepath) as conn :
    Query_String = ("SELECT news_id, category, publisher "
                    "FROM newsMain "
                    "WHERE publisher=? AND category=?")
    cursorDB = conn.execute(Query_String, ("중앙일보", "사회"))
    rows = cursorDB.fetchall()
    for row in rows[:10] :
        print(row)

 

또한 Parameter는 Dictionary 행태로 처리할 수 있으며, Named Placeholder라고 지칭합니다. 사용하는 방법은 아래와 같습니다. 

filepath = "D:/SQLite/news_sqlite.sqlite"
with sqlite3.connect(filepath) as conn :
    Query_String = ("SELECT news_id, category, publisher "
                    "FROM newsMain "
                    "WHERE publisher=:publisher AND category=:category")
    cursorDB = conn.execute(Query_String, {"publisher" : "중앙일보", "category" : "사회"})
    rows = cursorDB.fetchall()
    for row in rows[:10] :
        print(row)

 

 

3. excute와 excutemany

마지막으로 excutemany에 대해서 살펴보도록 하겠습니다. excute는 하나의 쿼리를 실행하는데 사용됩니다. 그러나 INSERT와 같이 여러 번 반복해 작업을 처리할 경우 굳이 for문을 사용하지 않고 처리할 수 있는 명령어 입니다. 

예시는 아래와 같습니다.  

filepath = "D:/SQLite/news_sqlite.sqlite"
with sqlite3.connect(filepath) as conn :    
    cursor = conn.cursor()    
    data = [
        (1, 'Alice', 'alice@example.com'),
        (2, 'Bob', 'bob@example.com'),
        (3, 'Charlie', 'charlie@example.com')
    ]    
    cursor.executemany('INSERT INTO users VALUES (?, ?, ?)', data)
    conn.commit()

 

4. 맺은말

이번 포스트는 Python에서 SQLite를 다루는 방법을 살펴보았습니다. 

 

SQLite는 다른 DBMS에 비해 다소 제약이 있지만 충실한 기본기를 가지고 있는 DBMS입니다. Airflow의 경우도 Sqlite를 기본으로 할 정도 입니다.   사용법은  정말로  간편합니다. 

 

본 포스트에서 소개한 내용을 중심으로 Sqlite에 대해서 숙지하시면 실무에 많은 도움이 될 것입니다.

반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함