[Python] SQLite + NoSQL + InMemoryDB = PyDbLite!
그럼 뭘 써야할까? -> 뭘 만드냐에 따라 다르다.
사용하는 용도가 틀리다보니 이런 단순한 비교 자체가 경우에 맞지 않을 수도 있지만 보편적으로는, SQLite가 무료로 사용할 수 있는 DB 중에서 가장 빠른 편이다.
파이썬에도 당연히 SQLite 라이브러리는 존재하지만 이번 포스팅에서는 파이썬에서 좀 더 신기한 라이브러리에 대해 알아볼까 한다.
PyDbLite
PyDbLite란, SQL 구문을 사용하지 않고 파이썬 구문만 사용하여 데이터를 관리하는 데이터베이스 엔진이다. (1)순수하게 Pure-Python 엔진으로 동작하기 때문에 SQL을 전혀 사용하지 않고, (2)SQLite에 호환되는 DB를 생성할 수 있으며, (3)인메모리 데이터베이스 사용을 제공한다.
(1) Pure-Python != NoSQL
사실대로 말하자면 이 라이브러리는 현재 열풍을 끌고 있는 NoSQL(비관계형 데이터베이스)이 아니다.제목 어그로를 끌기 위한 필자의 발악이다
실제 DB 내부에서는 테이블, 행, 열, 인덱스 등으로 엄격히 구분되기 때문에 NoSQL의 유연성을 따라갈 수는 없지만, SQL을 사용하지 않고 파이썬의 여러 구문을 통해 DB를 제어할 수 있어 NoSQL의 특징들을 흉내낼 수 있다.
(2) PyDbLite += SQLite
PyDbLite는 독자적으로 지원하는 파이썬 전용 DB 뿐만 아니라, 기존의 SQL을 전혀 쓰지 않음에도 SQLite의 DB 파일에 접근하고, 수정하고 또한 생성할 수 있는 인터페이스를 제공한다.
(3) File DB 및 InMemory DB 지원
인메모리 DB는 말그대로 Memory안에서 DB 데이터를 관리하는 것을 말한다. 컴퓨터 공학에서 Memory라고 한다면 보통 주기억장치(RAM 등)와 보조기억장치(HDD, SSD 등) 등이 모두 포함되지만 현업에서는 RAM을 말한다.
전원을 꺼버리면 데이터가 사라지는 RAM에 DB 데이터를 저장한다니 터무니없다라는 생각을 할 수도 있다. 그러나 RAM은 HDD나 SSD보다 월등히 빠르다.
웹 서비스 등을 예로 들어도 24시간 동안 서버를 켜놓아야 지속적으로 서비스가 가능한데, 휘발성의 특징을 보완하여 데이터의 백업만 잘해둔다면, 일반적인 디스크 검색보다 훨씬 더 빠른 자료 접근이 가능하게 한다.(물론 용량 문제는 알아서)
패키지 설치
pip를 이용해 간편하게 설치할 수 있다. (Supported Python versions: 2.6+)
혹시나 수동 설치를 원한다면, 아래의 링크를 통해 Github로 가서 직접 빌드하도록 하자.
예제 코드
각 클래스 및 메소드의 정의 및 사용법은 아래의 링크에서 자세하게 설명해준다.(영어긴 하지만)
사실 메소드 자체가 정말 직관적이라, DB 관련 API를 몇 번 사용 안 해본 필자같은 초심자라도 사용법을 굳이 읽지 않고 바로 예제 코드를 읽어보면 쉽게 이해할 수 있었다.
Pure Python API (자체 파이썬 DB)
SQLite API (SQLite DB로 떨구기)
파일로 DB를 남기고 싶을 경우에는 Base() 혹은 Database() 메소드의 인자로 파일의 이름을 인자로, 만약 메모리로 넘기고 싶을 경우, ":memory:"를 인자로 주면 된다.
SQLite 자체가 초거대 용량의 데이터를 다루기에는 적합하지 않다는 평이 많다. 그런데 Memory(RAM) 또한 큰 용량을 가진게 없으니 속도 면에서는 꽤 찰떡 궁합인 거 같다.
p.s.
1. pydblite.sqlite 코드 내부를 직접 살펴보니, 메소드를 실제 SQLite 라이브러리의 메소드를 사용해 쿼리로 다시 바꿔서 SQLite DB 파일을 생성하는 듯하다.(결국 SQL 사용함..)
2. 사실, 필자는 저게 진짜 메모리 내에서 동작하는 DB인지 잘 모르겠다; (RAM 내부 데이터를 확인하는 방법을 몰라서.., 혹시 누구 아는분..?)
3. SQLite의 경우, DB 내부를 GUI로 확인할 수 있는 편리한 툴이 많다. 하지만 Pure-Python DB는 읽을 수 있는 툴이 없기 때문에 자신이 직접 파싱하는 검증 코드도 짜야한다는 귀찮은 점이 있다.