- ZODB
-
Zope Object DataBase Тип Разработчик 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]:
- прозрачное длительное хранение объектов Python;
- транзакции, полная поддержка ACID, включая точки сохранения[10];
- многоверсионное управление конкурентным доступом (MVCC)[11];
- история и откат изменений (англ. undo);
- поддержка больших двоичных объектов (BLOB);
- масштабируемая архитектура (при использовании ZEO).
Прозрачность
С объектами приложения, использующего 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') # открытый файл
Виды подключаемых хранилищ
- Файловое хранилище (англ. file storage). Сохраняет объекты на диске. Рассчитано на один процесс.
- Сетевое хранилище — ZEO. Позволяет многим процессам загружать и хранить объекты одновременно[21].
- Хранилище RelStorage. Объекты сохраняются в реляционной СУБД[22].
- Каталогизированное хранилище (англ. directory storage). Каждый объект хранится в отдельном файле файловой системы[23].
- Демо-хранилище (англ. demo storage). Для хранения объектов дополнительно к базовому хранилищу, которое доступно только для чтения[24].
По данным каталога программного обеспечения для Python (PyPI) имеются и другие ZODB-хранилища, решающие более специализированные задачи.
Примечания
- ↑ ZODB3 3.10.5
- ↑ Bernstein, 2002, p. 563
- ↑ [grok.zope.org/documentation/tutorial/adder-an-adding-machine-sample-application/a-grok-application-and-grok-model/ Grok tutorial]
- ↑ Zenoss Data Stores
- ↑ ZEO (из документации по Indico)
- ↑ Indico
- ↑ по данным исторической справки в README-файле в поставке исходного кода название было BoboPOS
- ↑ www.zodb.org
- ↑ Zope использует объектную базу данных
- ↑ Zope Foundation ZODB Programming. Архивировано из первоисточника 16 июля 2012.
- ↑ Multiversion concurrency control (MVCC)
- ↑ Weitershausen, 2007, pp. 84-85
- ↑ Bernstein, 2002, p. 401
- ↑ Патрик О'Брайен (Patrick O'Brien) Управление персистентностью Python. Архивировано из первоисточника 17 июля 2012.
- ↑ Lutz, 2006, pp. 1218-1219
- ↑ Введение в ZODB
- ↑ ZODB Programming
- ↑ Bernstein, p. 399
- ↑ ZODB programming guide — Related modules
- ↑ Bernstein, p. 402
- ↑ Lutz, 2006, p. 1218
- ↑ Запись о RelStorage на PyPI
- ↑ Запись о DirectoryStorage на PyPI
- ↑ Запись о DemoStorage на PyPI
Ссылки
- Официальный сайт документации по ZODB (англ.)
- Introduction to the Zope Object Database, Jim Fulton, 2000 (англ.)
- ZODB (англ.) (техническая информация на сайте, посвящённом системе Indico)
- ZODB Book (англ.) («Книга ZODB», которая пишется усилиями сообщества)
Литература
- Mark Lutz. Programming Python, 3rd Edition. — O'Reilly Media, 2006. — 1600 с. — ISBN 978-0-596-00925-0, pp. 1216—1226
- Michael R. Bernstein, Scott Robertson and Coedit Development Team. Zope Bible. — Hungry Minds, 2002. — ISBN 0764548573, pp. 397—411
- Philipp Weitershausen. Web Component Development With Zope 3. — Springer, 2007. — ISBN 978-3-540-33807-9
Системы управления базами данных (СУБД) Клиент-серверные 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
Компоненты Категории:- Программное обеспечение по алфавиту
- Объектно-ориентированные базы данных
- Кроссплатформенное программное обеспечение
- Свободные СУБД
- СУБД
- Хранилище данных
- Библиотеки Python
Wikimedia Foundation. 2010.