ZODB () — объектно-ориентированная база данных (ООБД) для Python-объектов. Входит в поставку сервера приложений Zope, но может использоваться и отдельно от него. Для балансировки нагрузки и кластеризации серверов служит ZEO (от ). Эта клиент-серверная технология позволяет нескольким Zope-серверам (то есть ZEO-клиентам) разделять единое хранилище данных. ZODB используется в различных системах управления содержимым, в том числе Plone.
История Создана Джимом Фултоном из Zope Corporation в конце 1990-х годов. В начале, в процессе разработки системы Principia (ставшей позднее именоваться Zope) называлась POS (от — система устойчивых объектов) или BoboPOSпо данным исторической справки в README-файле в поставке исходного кода название было BoboPOS. При очередном значительном изменении архитектуры была переименована в ZODB3. Был также короткоживущий проект ZODB4 по переписыванию ZODB3 на «чистом» Python в начале 2000-х годов, но он не был завершён (не следует путать с версиями 4, появившимися в 2012 году).
Свойства Некоторые свойства ZODB: прозрачное длительное хранение объектов Python; транзакции, полная поддержка ACID, включая точки сохранения; многоверсионное управление конкурентным доступом (MVCC)Multiversion concurrency control (MVCC) ; история и откат изменений (); поддержка больших двоичных объектов (BLOB); масштабируемая архитектура (при использовании ZEO).
Прозрачность С объектами приложения, использующего ZODB, можно работать как с обычными объектами языка Python, то есть, механизмы хранения почти полностью прозрачны: не требуется специальных методов или интерфейсов для управления данными. Единственным условием для обеспечения устойчивости объектов является наследование от класса Persistent. Для базовых типов языка Python достаточно, чтобы они поддавались «консервированию» () методами стандартной библиотеки Python.
История и откат изменений Даже давно выполненная и сохранённая в базе данных транзакция может быть отменена. Более того, ZODB хранит версии для каждого хранимого объекта, что позволяет, не без некоторых ограничений, управлять версиями.
Принципы работы Хранилище ZODB логически представляет собой ориентированный граф объектов языка Python, корнем которого является словарь Python. Доступ к объектам осуществляется обходом () по указателям, начиная с корня и заканчивая целевым объектом.
ZODB использует механизм сериализации объектов из стандартной библиотеки Python, так называемое консервирование ().
Примеры Следующий пример (использована Unix-подобная ОС) иллюстрирует программирование для ZODB. В примере использована конфигурация с ZEO. Для правильной работы примера необходимо установить библиотеку ZODB (скажем, в Ubuntu, это можно сделать командой sudo apt-get install python-zodb).
Во-первых, необходимо запустить ZEO-сервер: runzeo -a localhost:8008 -f /tmp/Data.fs
Во-вторых, требуется файл конфигурации ZEO-клиента (для простоты, /tmp/zeo.conf), где будет указан адрес сервера: server localhost:8008
Наконец, программа на 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() # окончание транзакции
Сохраняемые объекты могут быть достаточно сложными, главное, чтобы для них работала сериализация.
Пример из документации описывает создание класса устойчивых объектовZODB Programming :
from persistent import Persistent class User(Persistent): pass
В связи с эти примером необходимо заметить, что присваивание атрибутам или их удаление отражается в базе данных. Объект класса, в котором присутствует примесь Persistent, является единицей хранения (подробнее см. storage unit) и в случае изменений перезаписывается в базе данных как единое целое.
Если объект без примеси 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-дерева)ZODB programming guide — Related modules .
Иногда возникает необходимость во вре́менных () атрибутах, которые не требуется (или невозможно) сохранять в базе данных. Атрибуты со специальным префиксом _v_ как раз служат этой цели:
userobj._v_openfile = open('some_file.dat') # открытый файл
Виды подключаемых хранилищ Файловое хранилище (). Сохраняет объекты на диске. Рассчитано на один процесс. Сетевое хранилище — ZEO. Позволяет многим процессам загружать и хранить объекты одновременно. Хранилище RelStorage. Объекты сохраняются в реляционной СУБД. Каталогизированное хранилище (). Каждый объект хранится в отдельном файле файловой системы. Демо-хранилище (). Для хранения объектов дополнительно к базовому хранилищу, которое доступно только для чтения.
По данным каталога программного обеспечения для Python (PyPI) имеются и другие ZODB-хранилища, решающие более специализированные задачи.
Применение ZODB используется в Zope, Plone (построен на Zope), Grok, Zenoss, ERP5, KARL (система управления знаниями) и некоторых других системах. Например, ZODB и ZEO (без Zope) используются в системе IndicoZEO (из документации по Indico) — программном обеспечении для организации симпозиумов, конференций, лекций и т. п., разработанном и используемом ЦЕРНом.
Примечания
Литература
Ссылки Официальный сайт документации по ZODB Introduction to the Zope Object Database, Jim Fulton, 2000 ZODB Book («Книга ZODB», которая пишется усилиями сообщества) Zope/ZODB FAQ for IT Administrators
Категория:Объектно-ориентированные базы данных Категория:Кроссплатформенное программное обеспечение Категория:Свободные СУБД Категория:СУБД Категория:Хранилище данных Категория:Библиотеки Python Категория:Статьи с примерами кода Python