파이썬 표준 라이브러리의 dbm 패키지는 DBM 스타일 데이터베이스를 사전(dictionary)처럼 다룰 수 있는 인터페이스를 제공합니다. dbm 라이브러리는 Ken Thompson이 작성한 간단한 데이터베이스 엔진으로, DBM은 'DataBase Manager'의 약자입니다. 이 라이브러리는 UNIX 운영체제에서 사용되며, 고정 크기의 버킷(bucket)에 단일 키(기본 키)를 기반으로 임의의 데이터를 저장하고, 해싱(hash) 기법을 활용해 키를 통한 빠른 데이터 검색을 지원합니다.
dbm 패키지의 주요 모듈
dbm 패키지에는 다음과 같은 모듈들이 포함되어 있습니다.
dbm.ndbm
dbm.ndbm 모듈은 Unix '(n)dbm' 라이브러리에 대한 인터페이스를 제공합니다. dbm 객체는 사전처럼 동작하며, 키와 값은 반드시 바이트(bytes) 형태로 저장해야 합니다. 단, 이 모듈은 items()와 values() 메서드를 지원하지 않습니다.
dbm.dumb
dbm.dumb 모듈은 순수 파이썬으로만 작성된 영속성(persistent) 사전형 인터페이스를 제공합니다. dbm.gnu 같은 다른 모듈과 달리 외부 라이브러리가 전혀 필요하지 않다는 것이 특징입니다. 다른 영속성 매핑과 마찬가지로 키와 값은 항상 바이트 형태로 저장됩니다.
whichdb() 함수로 구현체 확인하기
이 모듈들은 파이썬의 shelve 모듈 내부에서 사용됩니다. shelve 데이터베이스와 마찬가지로, 사용자가 지정한 데이터베이스 이름에는 '.dir' 접미사가 붙습니다. dbm 객체의 whichdb() 함수를 사용하면 현재 파이썬 설치 환경에서 어떤 dbm 구현체가 사용 가능한지 알 수 있습니다.
>>> dbm.whichdb('mydbm.db')실행 결과:
'dbm.dumb'
데이터베이스 열기와 데이터 저장
open() 함수에 'n' 플래그를 지정하면 새 데이터베이스를 생성할 수 있습니다. 아래 예제는 'mydbm.db' 파일을 새로 만들고 키-값 쌍을 저장한 뒤 닫는 과정을 보여줍니다.
>>> db = dbm.open('mydbm.db','n')
>>> db['name'] = b'Rajani Deshmukh'
>>> db['address'] = b'Shivajinagar Pune'
>>> db['PIN'] = b'431001'
>>> db.close()open() 함수의 모드 플래그
| 값 | 의미 |
|---|---|
| 'r' | 기존 데이터베이스를 읽기 전용으로 열기 (기본값) |
| 'w' | 기존 데이터베이스를 읽기/쓰기용으로 열기 |
| 'c' | 읽기/쓰기용으로 열되, 파일이 없으면 새로 생성 |
| 'n' | 항상 비어 있는 새 데이터베이스를 생성하여 읽기/쓰기용으로 열기 |
사전처럼 활용하기
dbm 객체는 shelf 객체와 마찬가지로 사전과 유사한 객체입니다. 따라서 일반적인 사전 연산을 그대로 수행할 수 있으며, get(), pop(), append(), update() 등의 메서드도 호출할 수 있습니다. 아래 코드는 'mydbm.db'를 'r' 플래그로 연 뒤, 저장된 키-값 쌍들을 순회하는 예제입니다.
>>> db = dbm.open('mydbm.db','r')
>>> for k,v in db.items():
print (k,v)
b'name' : b'Rajani Deshmukh'
b'address' : b'Shivajinagar Pune'
b'PIN' : b'431001'dbm 객체의 주요 메서드
sync(): 디스크상의 디렉터리 및 데이터 파일을 동기화합니다. 이 메서드는 Shelve.sync() 메서드에 의해 내부적으로 호출됩니다.
close(): dbm 데이터베이스를 닫습니다.
GNU dbm(gdbm) 객체의 추가 메서드
firstkey()
이 메서드와 nextkey() 메서드를 함께 사용하면 데이터베이스의 모든 키를 순회할 수 있습니다. firstkey()는 순회의 시작점이 되는 첫 번째 키를 반환합니다.
gdbm.nextkey(key)
순회 과정에서 지정한 key 다음에 오는 키를 반환합니다.
gdbm.reorganize()
데이터베이스 파일을 재구성(reorganize)합니다. GNU dbm 객체는 이 재구성 함수를 사용하지 않는 한 데이터베이스 파일의 크기를 줄이지 않으며, 삭제된 공간은 그대로 유지되다가 새로운 (키, 값) 쌍이 추가될 때 재사용됩니다.