Русская Википедия:ZODB

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Шаблон:Карточка программы ZODB (Шаблон:Lang-en) — объектно-ориентированная база данных (ООБД) для Python-объектов. Входит в поставку сервера приложений Zope, но может использоваться и отдельно от него. Для балансировки нагрузки и кластеризации серверов служит ZEO (от Шаблон:Lang-en). Эта клиент-серверная технология позволяет нескольким Zope-серверам (то есть ZEO-клиентам) разделять единое хранилище данныхШаблон:Sfn. ZODB используется в различных системах управления содержимым, в том числе Plone.

История

Создана Джимом Фултоном из Zope Corporation в конце 1990-х годов. В начале, в процессе разработки системы Principia (ставшей позднее именоваться Zope) называлась POS (от Шаблон:Lang-en — система устойчивых объектов) или BoboPOS[1]. При очередном значительном изменении архитектуры была переименована в ZODB3. Был также короткоживущий проект ZODB4 по переписыванию ZODB3 на «чистом» Python в начале 2000-х годов[2], но он не был завершён (не следует путать с версиями 4, появившимися в 2012 году[3]).

Свойства

Некоторые свойства ZODB[4][5]:

Прозрачность

С объектами приложения, использующего ZODB, можно работать как с обычными объектами языка Python, то есть, механизмы хранения почти полностью прозрачны: не требуется специальных методов или интерфейсов для управления данными. Единственным условием для обеспечения устойчивости объектов является наследование от класса Persistent. Для базовых типов языка Python достаточно, чтобы они поддавались «консервированию» (Шаблон:Lang-en) методами стандартной библиотеки Python.

История и откат изменений

Даже давно выполненная и сохранённая в базе данных транзакция может быть отменена. Более того, ZODB хранит версии для каждого хранимого объекта, что позволяет, не без некоторых ограничений, управлять версиямиШаблон:Sfn.

Принципы работы

Хранилище ZODB логически представляет собой ориентированный граф объектов языка Python, корнем которого является словарь Python. Доступ к объектам осуществляется обходом (Шаблон:Lang-en) по указателям, начиная с корня и заканчивая целевым объектом.

ZODB использует механизм сериализации объектов из стандартной библиотеки Python, так называемое консервирование (Шаблон:Lang-en)Шаблон:Sfn[8].

Примеры

Следующий пример (использована Unix-подобная ОС) иллюстрирует программирование для ZODBШаблон:Sfn. В примере использована конфигурация с ZEO[9]. Для правильной работы примера необходимо установить библиотеку ZODB (скажем, в Ubuntu, это можно сделать командой sudo apt-get install python-zodb).

Во-первых, необходимо запустить ZEO-сервер:

runzeo -a localhost:8008 -f /tmp/Data.fs

Во-вторых, требуется файл конфигурации ZEO-клиента (для простоты, /tmp/zeo.conf), где будет указан адрес сервера:

<zodb>
   <zeoclient>
   server localhost:8008
   </zeoclient>
</zodb>

Наконец, программа на Python записывает в корень объект с именем my_object и значением в виде строки:

 import ZODB.config
 import transaction
 db = ZODB.config.databaseFromURL('/tmp/zeo.conf')
 connection = db.open()           # устанавливаем соединение
 root = connection.root()         # получаем корень
 root['my_object'] = 'My object'  # записываем объект
 transaction.commit()             # окончание транзакции

Сохраняемые объекты могут быть достаточно сложными, главное, чтобы для них работала сериализация.

Пример из документации описывает создание класса устойчивых объектов[10]:

from persistent import Persistent
class User(Persistent):
    pass

В связи с эти примером необходимо заметить, что присваивание атрибутам или их удаление отражается в базе данных. Объект класса, в котором присутствует примесь PersistentШаблон:Sfn, является единицей хранения (подробнее см. storage unitШаблон:Ref-en) и в случае изменений перезаписывается в базе данных как единое целое.

Если объект без примеси Persistent имеет атрибут с изменчивым значением, например, встроенный в Python объект типа список (list), изменения внутри списка не будут замечены без дополнительных усилий.

userobj = User()
root['user'] = userobj        # Это изменение будет записано.
userobj.friends = ['A', 'B']  # Простой (т.е. не Persistent) список.
userobj.friends.append('C')   # Его изменение не отражается в базе
userobj._p_changed = True     # без этой подсказки.

Для распространённых сложных структур данных имеются устойчивые аналоги: PersistentList (для списка), PersistentMapping (для отображения), а также типы данных из пакета BTree (реализация B-дерева)[11].

Иногда возникает необходимость во вре́менных (Шаблон:Lang-en) атрибутах, которые не требуется (или невозможно) сохранять в базе данных. Атрибуты со специальным префиксом _v_ как раз служат этой целиШаблон:Sfn:

userobj._v_openfile = open('some_file.dat')     # открытый файл

Виды подключаемых хранилищ

  • Файловое хранилище (Шаблон:Lang-en). Сохраняет объекты на диске. Рассчитано на один процесс.
  • Сетевое хранилище — ZEO. Позволяет многим процессам загружать и хранить объекты одновременноШаблон:Sfn.
  • Хранилище RelStorage. Объекты сохраняются в реляционной СУБД[12].
  • Каталогизированное хранилище (Шаблон:Lang-en). Каждый объект хранится в отдельном файле файловой системы[13].
  • Демо-хранилище (Шаблон:Lang-en). Для хранения объектов дополнительно к базовому хранилищу, которое доступно только для чтения[14].

По данным каталога программного обеспечения для Python (PyPI) имеются и другие ZODB-хранилища, решающие более специализированные задачи.

Применение

ZODB используется в Zope, Plone (построен на Zope), Grok[15], Zenoss[16], ERP5, KARL (система управления знаниями)[17] и некоторых других системах. Например, ZODB и ZEO (без Zope) используются в системе Indico[18] — программном обеспечении для организации симпозиумов, конференций, лекций и т. п., разработанном и используемом ЦЕРНом[19].

Примечания

Шаблон:Примечания

Литература

Ссылки

Шаблон:СУБД Шаблон:Databases

  1. по данным исторической справки в README-файле в поставке исходного кода название было BoboPOS
  2. Шаблон:Cite web
  3. Ошибка цитирования Неверный тег <ref>; для сносок latest не указан текст
  4. Шаблон:Cite web
  5. Шаблон:Cite web
  6. Шаблон:Cite web
  7. Multiversion concurrency control (MVCC) Шаблон:Webarchive
  8. Шаблон:Cite web
  9. Шаблон:Cite web
  10. ZODB Programming Шаблон:Webarchive
  11. ZODB programming guide — Related modules Шаблон:Webarchive
  12. Шаблон:Cite web
  13. Шаблон:Cite web
  14. Шаблон:Cite web
  15. Шаблон:Cite web
  16. Шаблон:Cite web
  17. Шаблон:Cite web
  18. ZEO Шаблон:Webarchive (из документации по Indico)
  19. Шаблон:Cite web