Joonas' Note

Joonas' Note

[파이썬 패키지] 설치 없이 가벼운 데이터베이스 (json-as-db; JAD) 본문

개발/python

[파이썬 패키지] 설치 없이 가벼운 데이터베이스 (json-as-db; JAD)

2023. 1. 27. 01:55 joonas

    최근에 회사에서 간단하게 파이썬으로 스크립트를 작성하다가 데이터베이스를 사용해야할 일이 있었다.

    간단한 목적이라 단순한 연산들만 있으면 되는데, 불필요하게 거대한 사이즈의 패키지들(SQLAlchemy, PyMongo 등)을 설치해야하는 게 불편했다.
    왜냐하면 경험상 이것들은 초기에 별도로 설정해야하는 작업이 굉장히 많기 때문이다.

    그래서 in-memory 여도 좋으니 간단한 설정으로 마치 json 객체처럼 사용할 수 있는 패키지가 있는 지 찾아보았는데, 이 당시에는 찾지 못했다. 개발을 꽤 마친 이후에 tinyDB 라는 아주 비슷한 동작의 패키지를 발견했다. (지금와서 보면 dict 호환성 측면에서 아주 미묘하게 다르다.)

    그럼 패키지를 사용하지 않고 built-in 패키지인 json 으로 커버하자니, 여러 데이터를 추가하고 쿼리로 특정 데이터를 찾는 부분을 구현하는 게 하나의 패키지를 구현하는 일과 맞먹는다. 사실 그것이 이 패키지 개발의 시작이었다.

    아무튼 개발 목적은 간단했다. 데이터베이스를 마치 dictionary 객체를 다루듯 하는 것이고, 적절히 파일로 저장도 하고 불러올수도 있는 것, 그리고 item을 추가하고 삭제하는 것이 원하는 전부였다.

    JSON as DB

    https://pypi.org/project/json-as-db/

     

    json-as-db

    Using JSON as very lightweight database

    pypi.org

    데이터베이스 선언, 데이터 추가

    데이터베이스는 dictionary 타입과 100% 호환되도록 구현했다.
    데이터베이스를 선언하려면 db = Database() 를 호출하면 끝이다.

    데이터베이스 선언 & 데이터 추가

    데이터를 넣는 것도 단순히 db.add(...) 를 호출하면 되고, 여러 개를 넣고 싶으면 db.add([{...}, {...}]) 처럼 리스트를 넘기면 된다.

    인터페이스는 최대한 직관적이면서 단순한 방향을 지향했다. 그것이 pythonic 이니까.

    불러오기, 쿼리

    데이터베이스 불러오기 & 확인 & 쿼리로 조회까지

    json 파일에서 불러오는 것도 구현했는 데 (0.2.4 버전 기준으로) 3가지의 JSON 포맷을 지원한다.
    하나는 JAD 데이터베이스 포맷대로 저장한 JSON 파일, 다른 하나는 트리 형태로 구성된 JSON 파일, 나머지는 Array만 들어있는 JSON 파일이다.

    쿼리문 구현도 이게 가능할까 싶어서 적어두긴 했었는데, 어쩌다보니 구현도 끝났고 잘 동작한다.

    개인적으로 pandas 처럼 항목을 보여주는 게 예뻐보여서 비슷하게 동작하도록 구현했다.

    Quick table view

    데이터베이스는 dict를 담는 list 의 형태라서 필드가 전부 동일하게 있지는 않지만, 없는 것은 알아서 생략하고 1차적으로 보여주면 될 거라고 생각해서 구현해봤고 실제 동작도 그럴싸하게 되는 것 같다.

    다음 업데이트에서는 터미널 크기에 맞게 출력하도록 변경했고 구현을 마쳤다.

    터미널 크기에 맞게 데이터베이스 출력

    문서

    자세한 내용은 README 와 Read The Docs 문서 (https://json-as-db.readthedocs.io/ ) 에 지속적으로 업데이트하고 있다.

    TO DO 기능들을 하나씩 구현해서 점차 키워나가고 싶다. 그리고 오픈 소스로 다같이 여러 기능을 구현하면 재밌겠다.

    이것도 하다보니 재미가 붙어서 점점 기능이 많아지고 있는데, 그러다보니 정작 패키지를 사용할 시간은 없어졌다. 간단하게 데이터베이스 띄우는 일이 많으니까, 분명히 언젠간 사용할 것 같다.

    벤치마킹

    여담으로, pandas와 한번 속도 비교를 해봤는데 대부분은 얼추 비슷하고 append 연산에서 매우 빨랐다.

    그래서 나머지 기능들도 한번 비교를 해볼까하는데, 테스트 케이스를 어떻게 작성할 지 고민이다.

     

    Comments