> **Источник:** https://python-all.ru/2.7/library/bsddb.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# 11.11. [`bsddb`](https://python-all.ru/2.7/library/bsddb.html#module-bsddb) – интерфейс к библиотеке Berkeley DB

Устарело с версии 2.6: Модуль [`bsddb`](https://python-all.ru/2.7/library/bsddb.html#module-bsddb) удалён в Python 3.

Модуль [`bsddb`](https://python-all.ru/2.7/library/bsddb.html#module-bsddb) предоставляет интерфейс к библиотеке Berkeley DB. Пользователи могут создавать файлы библиотеки на основе хешей, B-деревьев или записей, используя соответствующий вызов open. Объекты bsddb в целом ведут себя как словари. Однако ключи и значения должны быть строками, поэтому для использования других объектов в качестве ключей или для хранения объектов других типов необходимо их каким-либо образом сериализовать, обычно с помощью [`marshal.dumps()`](https://python-all.ru/2.7/library/marshal.html#marshal.dumps) или [`pickle.dumps()`](https://python-all.ru/2.7/library/pickle.html#pickle.dumps).

Модуль [`bsddb`](https://python-all.ru/2.7/library/bsddb.html#module-bsddb) требует версию библиотеки Berkeley DB с 4.0 по 4.7.

> **См. также**
>
> **[http://www.jcea.es/programacion/pybsddb.htm](https://python-all.ru/2.7/library/bsddb.html)**
>
> Веб-сайт с документацией для интерфейса `bsddb.db` Python Berkeley DB, который в точности повторяет объектно-ориентированный интерфейс, предоставляемый в самом Berkeley DB 4.x.
>
> **[http://www.oracle.com/database/berkeley-db/](https://python-all.ru/2.7/library/bsddb.html)**
>
> Библиотека Berkeley DB.

Более современный интерфейс объектов DB, DBEnv и DBSequence доступен в модуле `bsddb.db`, который в точности соответствует C API Berkeley DB, описанному по указанным выше адресам. Дополнительные возможности, предоставляемые API `bsddb.db`, включают тонкую настройку, транзакции, журналирование и многопроцессный конкурентный доступ к базе данных.

Ниже приводится описание устаревшего интерфейса [`bsddb`](https://python-all.ru/2.7/library/bsddb.html#module-bsddb), совместимого со старым модулем Python bsddb. Начиная с Python 2.5 этот интерфейс должен быть безопасным для многопоточного доступа. API `bsddb.db` рекомендуется для пользователей, работающих с потоками, так как он обеспечивает лучший контроль.

Модуль [`bsddb`](https://python-all.ru/2.7/library/bsddb.html#module-bsddb) определяет следующие функции, создающие объекты для доступа к соответствующему типу файла Berkeley DB. Первые два аргумента каждой функции одинаковы. Для удобства переносимости в большинстве случаев следует использовать только первые два аргумента.

#### `bsddb.hashopen(filename[, flag[, mode[, pgsize[, ffactor[, nelem[, cachesize[, lorder[, hflags]]]]]]]])`

Открыть файл в хеш-формате с именем *filename*. Файлы, которые не предназначены для сохранения на диске, можно создать, передав `None` в качестве *filename*. Необязательный параметр *flag* определяет режим открытия файла. Он может быть `'r'` (только чтение), `'w'` (чтение-запись), `'c'` (чтение-запись – создать при необходимости; по умолчанию) или `'n'` (чтение-запись – усечь до нулевой длины). Остальные аргументы используются редко и просто передаются low-level функции `dbopen()`. Обратитесь к документации Berkeley DB за разъяснением их использования и назначения.

#### `bsddb.btopen(filename[, flag[, mode[, btflags[, cachesize[, maxkeypage[, minkeypage[, pgsize[, lorder]]]]]]]])`

Открыть файл в формате B-дерева с именем *filename*. Файлы, которые не предназначены для сохранения на диске, можно создать, передав `None` в качестве *filename*. Необязательный параметр *flag* определяет режим открытия файла. Он может быть `'r'` (только чтение), `'w'` (чтение-запись), `'c'` (чтение-запись – создать при необходимости; по умолчанию) или `'n'` (чтение-запись – усечь до нулевой длины). Остальные аргументы используются редко и просто передаются low-level функции dbopen. Обратитесь к документации Berkeley DB за разъяснением их использования и назначения.

#### `bsddb.rnopen(filename[, flag[, mode[, rnflags[, cachesize[, pgsize[, lorder[, rlen[, delim[, source[, pad]]]]]]]]]])`

Открыть файл в формате записей DB с именем *filename*. Файлы, которые не предназначены для сохранения на диске, можно создать, передав `None` в качестве *filename*. Необязательный параметр *flag* определяет режим открытия файла. Он может быть `'r'` (только чтение), `'w'` (чтение-запись), `'c'` (чтение-запись – создать при необходимости; по умолчанию) или `'n'` (чтение-запись – усечь до нулевой длины). Остальные аргументы используются редко и просто передаются low-level функции dbopen. Обратитесь к документации Berkeley DB за разъяснением их использования и назначения.

> **Примечание**
>
> Начиная с версии 2.3 в некоторых Unix-версиях Python может присутствовать модуль `bsddb185`. Он присутствует *только* для обеспечения обратной совместимости с системами, поставляемыми со старой библиотекой базы данных Berkeley DB 1.85. Модуль `bsddb185` никогда не следует использовать напрямую в новом коде. Этот модуль удалён в Python 3. Если вы обнаружите, что он всё ещё нужен, ищите его в PyPI.

> **См. также**
>
> **Модуль [`dbhash`](https://python-all.ru/2.7/library/dbhash.html#module-dbhash)**
>
> Интерфейс в стиле DBM к [`bsddb`](https://python-all.ru/2.7/library/bsddb.html#module-bsddb)

## 11.11.1. Объекты Hash, BTree и Record

После создания экземпляра объекты hash, btree и record поддерживают те же методы, что и словари. Кроме того, они поддерживают методы, перечисленные ниже.

Изменено в версии 2.3.1: Добавлены методы словаря.

#### `bsddbobject.close()`

Закрывает базовый файл. Объект больше не может быть доступен. Поскольку для этих объектов не существует метода open [`open()`](https://python-all.ru/2.7/library/functions.html#open), чтобы снова открыть файл, необходимо вызвать новую функцию open модуля [`bsddb`](https://python-all.ru/2.7/library/bsddb.html#module-bsddb).

#### `bsddbobject.keys()`

Возвращает список ключей, содержащихся в файле DB. Порядок списка не определён и на него не следует полагаться. В частности, порядок возвращаемого списка различается для разных форматов файлов.

#### `bsddbobject.has_key(key)`

Возвращает `1`, если файл DB содержит аргумент в качестве ключа.

#### `bsddbobject.set_location(key)`

Устанавливает курсор на элемент, указанный *key*, и возвращает кортеж, содержащий ключ и его значение. Для баз данных на основе бинарных деревьев (открытых с помощью [`btopen()`](https://python-all.ru/2.7/library/bsddb.html#bsddb.btopen)), если *key* фактически не существует в базе данных, курсор будет указывать на следующий элемент в отсортированном порядке и вернёт этот ключ и значение. Для других баз данных будет вызвано [`KeyError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.KeyError), если *key* не будет найден в базе данных.

#### `bsddbobject.first()`

Устанавливает курсор на первый элемент в файле DB и возвращает его. Порядок ключей в файле не определён, за исключением баз данных B-Tree. Этот метод вызывает `bsddb.error`, если база данных пуста.

#### `bsddbobject.next()`

Устанавливает курсор на следующий элемент в файле DB и возвращает его. Порядок ключей в файле не определён, за исключением баз данных B-Tree.

#### `bsddbobject.previous()`

Устанавливает курсор на предыдущий элемент в файле DB и возвращает его. Порядок ключей в файле не определён, за исключением баз данных B-Tree. Это не поддерживается для хеш-таблиц (открытых с помощью [`hashopen()`](https://python-all.ru/2.7/library/bsddb.html#bsddb.hashopen)).

#### `bsddbobject.last()`

Устанавливает курсор на последний элемент в файле DB и возвращает его. Порядок ключей в файле не определён. Это не поддерживается для хеш-таблиц (открытых с помощью [`hashopen()`](https://python-all.ru/2.7/library/bsddb.html#bsddb.hashopen)). Этот метод вызывает `bsddb.error`, если база данных пуста.

#### `bsddbobject.sync()`

Синхронизирует базу данных на диске.

Пример:

```python
>>> import bsddb
>>> db = bsddb.btopen('spam.db', 'c')
>>> for i in range(10): db['%d'%i] = '%d'% (i*i)
...
>>> db['3']
'9'
>>> db.keys()
['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
>>> db.first()
('0', '0')
>>> db.next()
('1', '1')
>>> db.last()
('9', '81')
>>> db.set_location('2')
('2', '4')
>>> db.previous()
('1', '1')
>>> for k, v in db.iteritems():
...     print k, v
0 0
1 1
2 4
3 9
4 16
5 25
6 36
7 49
8 64
9 81
>>> '8' in db
True
>>> db.sync()
0
```
