# `dbm` — 유닉스 “데이터베이스” 인터페이스

소스 코드: Lib/dbm/__init__.py

`dbm`은 DBM 데이터베이스 변형에 대한 일반 인터페이스입니다 — `dbm.gnu` 또는 `dbm.ndbm`. 이러한 모듈이 설치되어 있지 않으면, `dbm.dumb` 모듈에 있는 느리지만 간단한 구현이 사용됩니다. 오라클 Berkeley DB에 대한 제삼자 인터페이스가 있습니다.

exception `dbm.``error`

  지원되는 각 모듈에 의해 발생할 수 있는 예외를 포함하는 튜플. 역시 `dbm.error`라고 이름 붙인 고유한 예외를 첫 번째 항목으로 갖고 있습니다 — `dbm.error`가 발생할 때 이것이 사용됩니다.

`dbm.``whichdb`(filename)

  이 함수는 사용 가능한 몇 가지 간단한 데이터베이스 모듈 — `dbm.gnu`, `dbm.ndbm` 또는 `dbm.dumb` — 중 어느 것을 사용하여 주어진 파일을 열어야 하는지 추측합니다.

  다음 값 중 하나를 반환합니다: 읽을 수 없거나 존재하지 않아 파일을 열 수 없으면 `None`; 파일 형식을 추측할 수 없으면 빈 문자열(`''`); 또는 필요한 모듈 이름을 포함하는 문자열, 가령 `'dbm.ndbm'`이나 `'dbm.gnu'`.

`dbm.``open`(file, flag='r', mode=0o666)

  데이터베이스 파일 file을 열고 해당 객체를 반환합니다.

  데이터베이스 파일이 이미 존재하면, `whichdb()` 함수를 사용하여 유형을 판별하고 적절한 모듈이 사용됩니다; 존재하지 않으면, 위에 나열된 것 중 임포트 할 수 있는 첫 번째 모듈이 사용됩니다.

  선택적 flag 인자는 다음과 같은 것이 될 수 있습니다:

  값 | 의미
  --- | ---
  `'r'` | 읽기 전용으로 기존 데이터베이스 열기 (기본값)
  `'w'` | 읽고 쓰기 위해 기존 데이터베이스 열기
  `'c'` | 읽고 쓰기 위해 데이터베이스를 열고, 존재하지 않으면 만들기
  `'n'` | 읽고 쓰기 위해 항상 새로운 빈 데이터베이스를 만들기

  선택적 mode 인자는 파일의 유닉스 모드이며, 데이터베이스를 만들 때만 사용됩니다. 기본값은 8진수 `0o666`입니다 (그리고 현재 umask에 의해 수정됩니다).

`open()`이 반환한 객체는 딕셔너리와 같은 기본 기능을 지원합니다; 키와 해당 값을 저장, 조회 및 삭제할 수 있으며, `get()`과 `setdefault()`뿐만 아니라 `in` 연산자와 `keys()` 메서드도 사용할 수 있습니다.

버전 3.2에서 변경: 이제 모든 데이터베이스 모듈에서 `get()`과 `setdefault()`를 사용할 수 있습니다.

버전 3.8에서 변경: 읽기 전용 데이터베이스에서 키를 삭제하면 `KeyError` 대신 데이터베이스 모듈 특정 에러가 발생합니다.

키와 값은 항상 바이트열로 저장됩니다. 이는 문자열이 사용될 때 저장되기 전에 기본 인코딩으로 묵시적으로 변환됨을 의미합니다.

이 객체는 `with` 문에서도 사용되도록 지원해서, 완료될 때 자동으로 닫힙니다.

버전 3.4에서 변경: `open()`이 반환한 객체에 컨텍스트 관리 프로토콜에 대한 기본 지원을 추가했습니다.

다음 예제는 일부 호스트 명과 해당 제목을 기록한 다음, 데이터베이스의 내용을 인쇄합니다:

    import dbm

    # Open database, creating it if necessary.
    with dbm.open('cache', 'c') as db:

        # Record some values
        db[b'hello'] = b'there'
        db['www.python.org'] = 'Python Website'
        db['www.cnn.com'] = 'Cable News Network'

        # Note that the keys are considered bytes now.
        assert db[b'www.python.org'] == b'Python Website'
        # Notice how the value is now in bytes.
        assert db['www.cnn.com'] == b'Cable News Network'

        # Often-used methods of the dict interface work too.
        print(db.get('python.org', b'not present'))

        # Storing a non-string key or value will raise an exception (most
        # likely a TypeError).
        db['www.yahoo.com'] = 4

    # db is automatically closed when leaving the with statement.

더 보기

모듈 `shelve`

  문자열이 아닌 데이터를 저장하는 지속성 모듈.

개별 서브 모듈은 다음 섹션에서 설명합니다.

## `dbm.gnu` — GNU의 dbm 재해석

소스 코드: Lib/dbm/gnu.py

이 모듈은 `dbm` 모듈과 매우 유사하지만, GNU 라이브러리 `gdbm`을 대신 사용하여 추가 기능을 제공합니다. `dbm.gnu`와 `dbm.ndbm`으로 만든 파일 형식은 서로 호환되지 않음에 유의하십시오.

`dbm.gnu` 모듈은 GNU DBM 라이브러리에 대한 인터페이스를 제공합니다. `dbm.gnu.gdbm` 객체는 키와 값이 저장되기 전에 항상 바이트열로 변환된다는 점을 제외하고는 매핑(딕셔너리)처럼 동작합니다. `gdbm` 객체를 인쇄해도 키와 값이 인쇄되지 않으며, `items()`와 `values()` 메서드는 지원되지 않습니다.

exception `dbm.gnu.``error`

  I/O 에러와 같은 `dbm.gnu` 특정 에러에서 발생합니다. 잘못된 키 지정과 같은 일반적인 매핑 에러에 대해서는 `KeyError`가 발생합니다.

`dbm.gnu.``open`(filename[, flag[, mode]])

  `gdbm` 데이터베이스를 열고 `gdbm` 객체를 반환합니다. filename 인자는 데이터베이스 파일의 이름입니다.

  선택적 flag 인자는 다음과 같은 것이 될 수 있습니다:

  값 | 의미
  --- | ---
  `'r'` | 읽기 전용으로 기존 데이터베이스 열기 (기본값)
  `'w'` | 읽고 쓰기 위해 기존 데이터베이스 열기
  `'c'` | 읽고 쓰기 위해 데이터베이스를 열고, 존재하지 않으면 만들기
  `'n'` | 읽고 쓰기 위해 항상 새로운 빈 데이터베이스를 만들기

  데이터베이스를 여는 방법을 제어하기 위해 다음과 같은 추가 문자가 flag에 추가될 수 있습니다:

  값 | 의미
  --- | ---
  `'f'` | 데이터베이스를 빠른 모드로 엽니다. 데이터베이스로의 쓰기는 동기화되지 않습니다.
  `'s'` | 동기화 모드. 이것은 데이터베이스 변경 사항이 파일에 즉시 기록되도록 합니다.
  `'u'` | 데이터베이스를 잠그지 않습니다.

  모든 플래그가 모든 버전의 `gdbm`에서 유효한 것은 아닙니다. 모듈 상수 `open_flags`는 지원되는 플래그 문자의 문자열입니다. 유효하지 않은 플래그가 지정되면 `error` 예외가 발생합니다.

  선택적 mode 인자는 파일의 유닉스 모드이며, 데이터베이스를 만들어야 할 때만 사용됩니다. 기본값은 8진수 `0o666`입니다.

  딕셔너리와 유사한 메서드 외에도, `gdbm` 객체에는 다음과 같은 메서드가 있습니다:

  `gdbm.``firstkey`()

    이 메서드와 `nextkey()` 메서드를 사용하여 데이터베이스의 모든 키를 순회할 수 있습니다. 순회는 `gdbm`의 내부 해시값 순이며, 키의 값으로 정렬되지 않습니다. 이 메서드는 시작 키를 반환합니다.

  `gdbm.``nextkey`(key)

    순회에서 key 뒤에 오는 키를 반환합니다. 다음 코드는 메모리에 모든 키를 포함하는 리스트를 만들지 않고, 데이터베이스 `db`의 모든 키를 인쇄합니다:

        k = db.firstkey()
        while k != None:
            print(k)
            k = db.nextkey(k)

  `gdbm.``reorganize`()

    많은 삭제를 수행한 후에, `gdbm` 파일이 사용하는 공간을 줄이려면, 이 루틴이 데이터베이스를 재구성합니다. `gdbm` 객체는 이 재구성을 사용할 때 외에는 데이터베이스 파일의 길이를 줄이지 않습니다; 그렇지 않으면, 삭제된 파일 공간이 유지되고 새 (키, 값) 쌍이 추가될 때 재사용됩니다.

  `gdbm.``sync`()

    데이터베이스가 빠른 모드로 열렸을 때, 이 메서드를 사용하면 기록되지 않은 데이터가 디스크에 기록됩니다.

  `gdbm.``close`()

    `gdbm` 데이터베이스를 닫습니다.

## `dbm.ndbm` — ndbm 기반 인터페이스

소스 코드: Lib/dbm/ndbm.py

`dbm.ndbm` 모듈은 유닉스 “(n) dbm” 라이브러리에 대한 인터페이스를 제공합니다. Dbm 객체는 키와 값이 항상 바이트열로 저장된다는 점을 제외하고는, 매핑(딕셔너리)처럼 동작합니다. `dbm` 객체를 인쇄해도 키와 값이 인쇄되지 않으며, `items()`와 `values()` 메서드는 지원되지 않습니다.

이 모듈은 “고전적인” ndbm 인터페이스나 GNU GDBM 호환 인터페이스로 사용할 수 있습니다. 유닉스에서, configure 스크립트는 이 모듈 빌드를 단순화하기 위해 적절한 헤더 파일을 찾습니다.

exception `dbm.ndbm.``error`

  I/O 에러와 같은 `dbm.ndbm` 특정 에러에서 발생합니다. 잘못된 키 지정과 같은 일반적인 매핑 에러에 대해서는 `KeyError`가 발생합니다.

`dbm.ndbm.``library`

  사용된 `ndbm` 구현 라이브러리의 이름.

`dbm.ndbm.``open`(filename[, flag[, mode]])

  dbm 데이터베이스를 열고 `ndbm` 객체를 반환합니다. filename 인자는 데이터베이스 파일의 이름입니다 (`.dir`이나 `.pag` 확장자는 없습니다).

  선택적 flag 인자는 다음 값 중 하나여야 합니다:

  값 | 의미
  --- | ---
  `'r'` | 읽기 전용으로 기존 데이터베이스 열기 (기본값)
  `'w'` | 읽고 쓰기 위해 기존 데이터베이스 열기
  `'c'` | 읽고 쓰기 위해 데이터베이스를 열고, 존재하지 않으면 만들기
  `'n'` | 읽고 쓰기 위해 항상 새로운 빈 데이터베이스를 만들기

  선택적 mode 인자는 파일의 유닉스 모드이며, 데이터베이스를 만들 때만 사용됩니다. 기본값은 8진수 `0o666`입니다 (그리고 현재 umask에 의해 수정됩니다).

  딕셔너리와 유사한 메서드 외에도, `ndbm` 객체는 다음 메서드를 제공합니다:

  `ndbm.``close`()

    `ndbm` 데이터베이스를 닫습니다.

## `dbm.dumb` — 이식성 있는 DBM 구현

소스 코드: Lib/dbm/dumb.py

참고

`dbm.dumb` 모듈은 더욱 강인한 모듈을 사용할 수 없을 때 `dbm` 모듈에 대한 최후의 대체 폴백으로 사용됩니다. `dbm.dumb` 모듈은 속도를 위해 작성되지 않았으며 다른 데이터베이스 모듈만큼 많이 사용되지는 않습니다.

`dbm.dumb` 모듈은 완전히 파이썬으로 작성된 지속적인(persistent) 딕셔너리와 유사한 인터페이스를 제공합니다. `dbm.gnu`와 같은 다른 모듈과 달리, 외부 라이브러리가 필요하지 않습니다. 다른 지속성 매핑처럼, 키와 값은 항상 바이트열로 저장됩니다.

모듈은 다음과 같은 것들을 정의합니다:

exception `dbm.dumb.``error`

  I/O 에러와 같은 `dbm.dumb` 특정 에러에서 발생합니다. 잘못된 키 지정과 같은 일반적인 매핑 에러에 대해서는 `KeyError`가 발생합니다.

`dbm.dumb.``open`(filename[, flag[, mode]])

  `dumbdbm` 데이터베이스를 열고 dumbdbm 객체를 반환합니다. filename 인자는 데이터베이스 파일의 베이스 이름입니다 (특정 확장자는 없습니다). dumbdbm 데이터베이스가 만들어질 때, `.dat`와 `.dir` 확장자를 가진 파일이 만들어집니다.

  선택적 flag 인자는 다음과 같은 것이 될 수 있습니다:

  값 | 의미
  --- | ---
  `'r'` | 읽기 전용으로 기존 데이터베이스 열기 (기본값)
  `'w'` | 읽고 쓰기 위해 기존 데이터베이스 열기
  `'c'` | 읽고 쓰기 위해 데이터베이스를 열고, 존재하지 않으면 만들기
  `'n'` | 읽고 쓰기 위해 항상 새로운 빈 데이터베이스를 만들기

  선택적 mode 인자는 파일의 유닉스 모드이며, 데이터베이스를 만들 때만 사용됩니다. 기본값은 8진수 `0o666`입니다 (그리고 현재 umask에 의해 수정됩니다).

  경고

  파이썬 AST 컴파일러의 스택 깊이 제한으로 인해, 충분히 큰/복잡한 항목이 있는 데이터베이스를 로드할 때 파이썬 인터프리터가 충돌할 수 있습니다.

  버전 3.5에서 변경: flag에 `'n'` 값이 있으면, `open()`은 항상 새 데이터베이스를 만듭니다.

  버전 3.8에서 변경: 플래그 `'r'`로 열린 데이터베이스는 이제 읽기 전용입니다. 플래그 `'r'`과 `'w'`로 열면 존재하지 않을 때 더는 데이터베이스를 만들지 않습니다.

  `collections.abc.MutableMapping` 클래스가 제공하는 메서드 외에도, `dumbdbm` 객체는 다음 메서드를 제공합니다:

  `dumbdbm.``sync`()

    디스크 상의 디렉터리와 데이터 파일을 동기화합니다. 이 메서드는 `Shelve.sync()` 메서드에 의해 호출됩니다.

  `dumbdbm.``close`()

    `dumbdbm` 데이터베이스를 닫습니다.