17-08-2023
Тип | |
---|---|
Разработчик |
Zope Corporation и соавторы |
Написана на | |
Операционная система | |
Последняя версия | |
Лицензия | |
Сайт |
zodb.org (англ.) |
ZODB (англ. Zope Object Database) — объектно-ориентированная база данных (ООБД) для Python-объектов. Входит в поставку сервера приложений Zope, но может использоваться и отдельно от него. Для балансировки нагрузки и кластеризации серверов служит ZEO (от англ. Zope Enterprise Objects). Эта клиент-серверная технология позволяет нескольким Zope-серверам (то есть ZEO-клиентам) разделять единое хранилище данных[2].
ZODB используется в Zope, Plone (построен на Zope), Grok[3], Zenoss[4], ERP5 и некоторых других системах. Например, ZODB и ZEO (без Zope) используются в системе Indico[5] — программном обеспечении для организации симпозиумов, конференций, лекций и т. п., разработанном и используемом ЦЕРНом[6].
Содержание |
Создана Джимом Фултоном из Zope Corporation в конце 1990-х годов. В начале, в процессе разработки системы Principia (ставшей позднее именоваться Zope) называлась POS (от англ. Persistent Object System — система устойчивых объектов) или BoboPOS[7]. При очередном значительном изменении архитектуры была переименована в ZODB 3. Был также короткоживущий проект ZODB 4 по переписыванию ZODB 3 на «чистом» Python, но он не был завершён.
Некоторые свойства ZODB[8][9]:
С объектами приложения, использующего ZODB, можно работать как с обычными объектами языка Python, то есть, механизмы хранения почти полностью прозрачны: не требуется специальных методов или интерфейсов для управления данными. Единственным условием для обеспечения устойчивости объектов является наследование от класса Persistent
. Для базовых типов языка Python достаточно, чтобы они поддавались «консервированию» (англ. pickle) методами стандартной библиотеки Python.
Даже давно выполненная и сохранённая в базе данных транзакция может быть отменена. Более того, ZODB хранит версии для каждого хранимого объекта, что позволяет, не без некоторых ограничений, управлять версиями[12].
Хранилище ZODB логически представляет из себя ориентированный граф объектов языка Python, корнем которого является словарь Python. Доступ к объектам осуществляется обходом (англ. traverse) по указателям, начиная с корня и заканчивая целевым объектом.
ZODB использует механизм сериализации объектов из стандартной библиотеки Python, так называемое консервирование (англ. "pickling")[13][14].
Следующий пример (использована Unix-подобная ОС) иллюстрирует программирование для ZODB[15]. В примере использована конфигурация с ZEO[16]. Для правильной работы примера необходимо установить библиотеку 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() # окончание транзакции
Сохраняемые объекты могут быть достаточно сложными, главное, чтобы для них работала сериализация.
Пример из документации описывает создание класса устойчивых объектов[17]:
from persistent import Persistent class User(Persistent): pass
В связи с эти примером необходимо заметить, что присваивание атрибутам или их удаление отражается в базе данных. Объект класса, в котором присутствует примесь Persistent
[18], является единицей хранения (подробнее см. 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-дерева)[19].
Иногда возникает необходимость во вре́менных (англ. volatile) атрибутах, которые не требуется (или невозможно) сохранять в базе данных. Атрибуты со специальным префиксом _v_
как раз служат этой цели[20]:
userobj._v_openfile = open('some_file.dat') # открытый файл
По данным каталога программного обеспечения для Python (PyPI) имеются и другие ZODB-хранилища, решающие более специализированные задачи.
Это заготовка статьи о программировании. Вы можете помочь проекту, исправив и дополнив её. |
Системы управления базами данных (СУБД) | |
---|---|
Клиент-серверные |
Caché • CouchDB • IMS • DB2 • Firebird • Informix • Ingres • InterBase • MS SQL Server • MongoDB • MySQL • mSQL • Oracle Database • Pervasive SQL • PostgreSQL • Sybase ASE • Sybase ASA • Sybase IQ • Teradata Database • ЛИНТЕР |
Движки | |
Файл-серверные |
DataFlex • dBase • MS Access • OpenOffice.org Base • Paradox • |
Базы данных | |
---|---|
Концепции |
Модель данных • Реляционная (модель • алгебра • Нормальная форма • Ссылочная целостность • БД • СУБД) • Иерархическая модель • Сетевая (модель • СУБД) • Объектно-ориентированная (БД • СУБД) • Транзакция • Журнализация • Секционирование |
Объекты | |
Ключи |
Потенциальный • Первичный • Внешний • Естественный • Суррогатный (искусственный) • Суперключ |
SQL | |
СУБД |
IMS • DB2 • Informix • Oracle Database • Microsoft SQL Server • Adaptive Server Enterprise • Teradata Database • Firebird • PostgreSQL • MySQL • SQLite • Microsoft Access • Visual FoxPro • ЛИНТЕР • CouchDB • MongoDB |
Компоненты |
ZODB.