Лавонкур
- 1 year ago
- 0
- 0
ZODB ( англ. Z ope O bject D ata b ase ) — объектно-ориентированная база данных (ООБД) для Python -объектов. Входит в поставку сервера приложений Zope , но может использоваться и отдельно от него. Для балансировки нагрузки и кластеризации серверов служит ZEO (от англ. Z ope E nterprise O bjects ). Эта клиент-серверная технология позволяет нескольким Zope-серверам (то есть ZEO-клиентам) разделять единое хранилище данных . ZODB используется в различных системах управления содержимым , в том числе Plone .
Создана из Zope Corporation в конце 1990-х годов. В начале, в процессе разработки системы Principia (ставшей позднее именоваться Zope ) называлась POS (от англ. Persistent Object System — система устойчивых объектов) или BoboPOS . При очередном значительном изменении архитектуры была переименована в ZODB3. Был также короткоживущий проект ZODB4 по переписыванию ZODB3 на «чистом» Python в начале 2000-х годов , но он не был завершён (не следует путать с версиями 4, появившимися в 2012 году ).
Некоторые свойства ZODB :
С объектами приложения, использующего ZODB, можно работать как с обычными объектами языка Python, то есть, механизмы хранения почти полностью прозрачны: не требуется специальных методов или интерфейсов для управления данными. Единственным условием для обеспечения устойчивости объектов является наследование от класса
Persistent
. Для базовых типов языка Python достаточно, чтобы они поддавались «консервированию» (
англ.
pickle
) методами
.
Даже давно выполненная и сохранённая в базе данных транзакция может быть отменена. Более того, ZODB хранит версии для каждого хранимого объекта, что позволяет, не без некоторых ограничений, управлять версиями .
Хранилище ZODB логически представляет собой ориентированный граф объектов языка Python, корнем которого является словарь Python. Доступ к объектам осуществляется обходом ( англ. traverse ) по указателям, начиная с корня и заканчивая целевым объектом.
ZODB использует механизм сериализации объектов из стандартной библиотеки Python, так называемое консервирование ( англ. pickling ) .
Следующий пример (использована
Unix-подобная ОС
) иллюстрирует программирование для ZODB
. В примере использована конфигурация с ZEO
. Для правильной работы примера необходимо установить библиотеку 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() # окончание транзакции
Сохраняемые объекты могут быть достаточно сложными, главное, чтобы для них работала сериализация.
Пример из документации описывает создание класса устойчивых объектов :
from persistent import Persistent
class User(Persistent):
pass
В связи с эти примером необходимо заметить, что присваивание атрибутам или их удаление отражается в базе данных. Объект класса, в котором присутствует
примесь
Persistent
, является
единицей хранения
(подробнее см.
(англ.)
) и в случае изменений перезаписывается в базе данных как единое целое.
Если объект без примеси
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-дерева ) .
Иногда возникает необходимость во вре́менных (
англ.
volatile
) атрибутах, которые не требуется (или невозможно) сохранять в базе данных. Атрибуты со специальным префиксом
_v_
как раз служат этой цели
:
userobj._v_openfile = open('some_file.dat') # открытый файл
По данным каталога программного обеспечения для Python ( PyPI ) имеются и другие ZODB-хранилища, решающие более специализированные задачи.
ZODB используется в Zope , Plone (построен на Zope), , , ERP5 , KARL (система управления знаниями) и некоторых других системах. Например, ZODB и ZEO (без Zope ) используются в системе — программном обеспечении для организации симпозиумов, конференций , лекций и т. п., разработанном и используемом ЦЕРНом .