SQLite3 사용기

업데이트:

개인 프로젝트를 할 때 sqlite를 써봅시다.

한 달 전부터 회사에서 db 테이블을 만들고, 여기에 데이터를 자동으로 넣는 작업을 수행하고있다. db에 대한 지식이 적다보니, 일단 무료로 이것저것 만들고 실험해볼 수 있는 프로덕트가 필요했다. 그러던 도중 sqlite를 만나게 됐다. 정말 프로토타입으로 활용하기 적절한 형태였는데, 이것을 사이드 프로젝트를 할 때에 활용해도 참 좋겠다는 생각을 했다. (무료이고, 가볍다보니까.) 개인 프로젝트 하시는 분들 중 데이터를 어디에 저장해야하는지 고민하던 분들에게 도움이 될까 싶어, sqlite3에 대한 내용을 정리하여 공유해본다.

  • 이 포스트가 도움이 될 만한 분들은,
    • 개인 프로젝트를 하는데 데이터를 저장할 곳이 필요한 분.
    • 매번 csv로 파일 관리를 하는데 어디에 다운했는지 까먹어서 열받은 경험이 있는 분
    • 메인 db에 무언가 작업을 하기 전에 프로토타입을 만들어보고 싶으신 분
  • 이 포스트가 도움이 안 되는 분들은,
    • sqlite3의 존재에 대해 알고계셨던 분
    • db에 대한 이해가 충분하신 분

/assets/images/sqlite3/Untitled.png

데이터를 어디에 저장해야하나..

당연하게도, 데이터 분석을 하려면 데이터가 필요하다. 데이터가 필요한 것은 알겠는데, 이 데이터를 대체 어디에 저장해야할까?

회사에서는 대부분 DB에 적재하고, 추출이 필요할 때에는 적절한 쿼리문을 활용해서 데이터를 추출한다.

그럼 개인 프로젝트를 할 때에는 데이터를 어떤 형태로 저장해야할까? csv? excel? 사실 이렇게 파일 형태로 저장하면 간편하기는 하지만 몇 가지 문제점들이 발생한다.

  • csv로 저장했을 때의 문제점을 살펴보자.
    • 파일이 손상될 수 있다.
    • 용량이 크다.
    • 관리해야하는 데이터가 많아져서 csv가 여러개라면 관리하기가 어렵다.
  • 그래서 csv를 대체하기 위해 데이터베이스를 사용하려 했으나, 이런 고민들이 생겼다.
    • 테이블 만드는 것부터 데이터 쌓는 것.. 어려울 것 같다.
    • 그리고 유료 아닌가?

그러던 도중, 구글링을 하다가 sqlite3를 만났다.


/assets/images/sqlite3/1200px-SQLite370.svg.png

SQLite

소개합니다! SQLite!

  • mysql과 같은 데이터베이스 관리 시스템이다.
  • 서버가 아니라, 응용 프로그램에 넣어서 사용한다.
  • 실제로 사용해보니, 사용법도 매우 간단하다.
  • 어떻게 읽나요?
    • 에스큐엘라이트
    • 시퀄라이트
  • 공식 홈페이지

장점

  • 무료! 가장 큰 장점이다.
  • 데이터베이스의 정보가 하나의 .db 파일에 저장된다.
  • python환경에선 sqlite3모듈을 활용하여 쉽게 사용할 수 있다.
    • python3에선 기본으로 제공하므로 설치도 필요 없다.
  • 사용하기에 굉장히 간편하고, 가볍다.

단점

  • 데이터 형식이 다른 프로덕트와 비교해서 상당히 적다.
  • 기능 또한 제한적인데, 예를 들자면 alter - 컬럼을 수정하는 작업이 불가능하다.
  • 대규모 데이터를 저장하기에는 적합하지 않다.

어떻게 사용하나?

  • 그럼 사용법을 한 번 알아보자.
  • 데이터를 추출하고, 쌓는 것에 대해서 중점적으로 살펴보자.

데이터 쌓기

  • 데이터를 쌓을 때 순서는 다음과 같다.
    1. db에 접속한다. (정해진 경로에 .db파일이 없다면 생성한다.)
    2. 커서를 생성한다.
      • 커서란?: 쿼리문에 의해서 반환되는 결과값들을 저장하는 메모리공간
    3. 테이블을 생성한다.
      • 테이블을 생성하는 두 가지 방법이 있다.
        1. CREATE문을 활용하여 만들기
        2. dataframe에서 to_sql 메서드를 활용해서 직접 테이블을 만들어버리기.(다만 이 방법은 모든 컬럼들을 TEXT 형태로 저장해버린다는 단점이 있다.)
    4. 테이블에 데이터를 넣는다.
      • dataframe에서 to_sql메서드를 활용해서 간편하게 데이터를 저장할 수 있다!
    5. db를 종료한다.
  • 코드로 살펴보자.
import sqlite3    # sqlite3는 파이썬에서 제공하므로 설치가 필요 없다
import pandas as pd

con = sqlite3.connect('test.db')   # db 접속
cur = con.cursor()    # 커서 생성

# 테이블 생성
q = 'CREATE TABLE temp (name TEXT, price INTEGER)'
cur.execute(q)    # 쿼리 실행

# db에 데이터 저장
df = pd.read_csv('data.csv')
df.to_sql('temp', con, if_exists='append')    # dataframe에서 db로 저장

con.close()
  • dataframe을 통해서 간편하게 데이터를 db로 바로 저장할 수 있다!
  • 여기서 주의할 점은, if_exists 파라미터인데, 만약에 테이블에 데이터가 존재하면 어떻게 하겠냐는 것을 설정한다.
    • 예를 들어, append 는 기존 데이터에 이어 붙여나가고, replace는 기존 데이터에 덮어씌운다.

데이터 추출

  • 데이터를 추출할 때 기본적인 순서는 다음과 같다.
    1. db에 접속한다. (정해진 경로에 .db파일이 없다면 생성한다.)
    2. 커서를 생성한다.
    3. 쿼리를 날린다.
    4. fetch문을 활용하여 데이터를 가져온다.
      • 쿼리문으로 날려서 추출된 데이터는 cursor에 저장되고, fetch를 활용하여 이를 불러옴
    5. db를 종료한다.
  • 코드로 살펴보면,
import sqlite3
con = sqlite3.connect('test.db')    # db접속
cur = con.cursor()    # 커서 생성

q = 'SELECT * FROM emp ORDER BY date DESC LIMIT 3'    # 쿼리문
cur.execute(q)    # 쿼리 실행
cur.fetchall()    # 데이터 조회
# cur.fetchone()    # 결과물의 첫 row 조회

con.close()

마무리

sqlite를 간단하게 정리하고, 테이블 생성과 데이터 추출하는 코드를 살펴보았다. 사실, 코드는 어떤 db를 활용하든 대부분 비슷하기 때문에, python으로 db에 접속해본 경험이 없다면, sqlite로 연습을 해보는 것도 좋은 경험이 될 것 같다.

최근에 회사에서 sqlite로 테이블을 생성하고 데이터를 적재까지 완료하였고, 이제 이를 메인 db인 mariadb로 이전시키는 작업을 해야한다. 크게 어려울 것 같지는 않지만, 일단 이전시키는 것까지 완료하고 관련된 포스트를 작성해보겠다.

댓글남기기