ZODB (англ. Zope Object Database) — объектно-ориентированная база данных (ООБД) для Python-объектов. Входит в поставку сервера приложений Zope, но может использоваться и отдельно от него. Для балансировки нагрузки и кластеризации серверов служит ZEO (от англ. Zope Enterprise Objects). Эта клиент-серверная технология позволяет нескольким Zope-серверам (то есть ZEO-клиентам) разделять единое хранилище данных[2]. ZODB используется в различных системах управления содержимым, в том числе Plone.
Zope Object DataBase | |||
---|---|---|---|
Тип | Объектно-ориентированная база данных | ||
Разработчики | Zope Corporation и соавторы | ||
Написана на | Python | ||
Операционная система | Кроссплатформенное ПО | ||
Последняя версия | |||
Репозиторий | github.com/zopefoundatio… | ||
| |||
| |||
Лицензия | Zope Public License | ||
Сайт | zodb.org |
История
правитьСоздана Джимом Фултоном из Zope Corporation в конце 1990-х годов. В начале, в процессе разработки системы Principia (ставшей позднее именоваться Zope) называлась POS (от англ. Persistent Object System — система устойчивых объектов) или BoboPOS[3]. При очередном значительном изменении архитектуры была переименована в ZODB3. Был также короткоживущий проект ZODB4 по переписыванию ZODB3 на «чистом» Python в начале 2000-х годов[4], но он не был завершён (не следует путать с версиями 4, появившимися в 2012 году[1]).
Свойства
правитьНекоторые свойства ZODB[5][6]:
- прозрачное длительное хранение объектов Python;
- транзакции, полная поддержка ACID, включая точки сохранения[7];
- многоверсионное управление конкурентным доступом (MVCC)[8];
- история и откат изменений (англ. undo);
- поддержка больших двоичных объектов (BLOB);
- масштабируемая архитектура (при использовании ZEO).
Прозрачность
правитьС объектами приложения, использующего ZODB, можно работать как с обычными объектами языка Python, то есть, механизмы хранения почти полностью прозрачны: не требуется специальных методов или интерфейсов для управления данными. Единственным условием для обеспечения устойчивости объектов является наследование от класса Persistent
. Для базовых типов языка Python достаточно, чтобы они поддавались «консервированию» (англ. pickle) методами стандартной библиотеки Python.
История и откат изменений
правитьДаже давно выполненная и сохранённая в базе данных транзакция может быть отменена. Более того, ZODB хранит версии для каждого хранимого объекта, что позволяет, не без некоторых ограничений, управлять версиями[9].
Принципы работы
правитьХранилище ZODB логически представляет собой ориентированный граф объектов языка Python, корнем которого является словарь Python. Доступ к объектам осуществляется обходом (англ. traverse) по указателям, начиная с корня и заканчивая целевым объектом.
ZODB использует механизм сериализации объектов из стандартной библиотеки Python, так называемое консервирование (англ. pickling)[10][11].
Примеры
правитьСледующий пример (использована Unix-подобная ОС) иллюстрирует программирование для ZODB[12]. В примере использована конфигурация с ZEO[13]. Для правильной работы примера необходимо установить библиотеку 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() # окончание транзакции
Сохраняемые объекты могут быть достаточно сложными, главное, чтобы для них работала сериализация.
Пример из документации описывает создание класса устойчивых объектов[14]:
from persistent import Persistent
class User(Persistent):
pass
В связи с эти примером необходимо заметить, что присваивание атрибутам или их удаление отражается в базе данных. Объект класса, в котором присутствует примесь Persistent
[15], является единицей хранения (подробнее см. 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-дерева)[16].
Иногда возникает необходимость во вре́менных (англ. volatile) атрибутах, которые не требуется (или невозможно) сохранять в базе данных. Атрибуты со специальным префиксом _v_
как раз служат этой цели[17]:
userobj._v_openfile = open('some_file.dat') # открытый файл
Виды подключаемых хранилищ
править- Файловое хранилище (англ. file storage). Сохраняет объекты на диске. Рассчитано на один процесс.
- Сетевое хранилище — ZEO. Позволяет многим процессам загружать и хранить объекты одновременно[18].
- Хранилище RelStorage. Объекты сохраняются в реляционной СУБД[19].
- Каталогизированное хранилище (англ. directory storage). Каждый объект хранится в отдельном файле файловой системы[20].
- Демо-хранилище (англ. demo storage). Для хранения объектов дополнительно к базовому хранилищу, которое доступно только для чтения[21].
По данным каталога программного обеспечения для Python (PyPI) имеются и другие ZODB-хранилища, решающие более специализированные задачи.
Применение
правитьZODB используется в Zope, Plone (построен на Zope), Grok[22], Zenoss[23], ERP5, KARL (система управления знаниями)[24] и некоторых других системах. Например, ZODB и ZEO (без Zope) используются в системе Indico[25] — программном обеспечении для организации симпозиумов, конференций, лекций и т. п., разработанном и используемом ЦЕРНом[26].
Примечания
править- ↑ 1 2 ZODB3 4.2.0 . Дата обращения: 6 января 2016. Архивировано 27 января 2016 года.
- ↑ Bernstein, 2002, p. 563.
- ↑ по данным исторической справки в README-файле в поставке исходного кода название было BoboPOS
- ↑ ZODB4 . Дата обращения: 6 января 2016. Архивировано 5 марта 2016 года.
- ↑ www.zodb.org . Дата обращения: 16 июля 2012. Архивировано 8 августа 2012 года.
- ↑ Zope использует объектную базу данных . Дата обращения: 17 июля 2012. Архивировано 24 марта 2016 года.
- ↑ Zope Foundation. ZODB Programming . Архивировано 16 июля 2012 года.
- ↑ Multiversion concurrency control (MVCC) Архивировано 6 февраля 2012 года.
- ↑ Weitershausen, 2007, pp. 84—85.
- ↑ Bernstein, 2002, p. 401.
- ↑ Патрик О’Брайен (Patrick O’Brien). Управление персистентностью Python . Архивировано 17 июля 2012 года.
- ↑ Lutz, 2006, pp. 1218—1219.
- ↑ Введение в ZODB . Дата обращения: 17 июля 2012. Архивировано 12 августа 2011 года.
- ↑ ZODB Programming Архивировано 9 февраля 2012 года.
- ↑ Bernstein, 2002, p. 399.
- ↑ ZODB programming guide — Related modules Архивировано 28 декабря 2011 года.
- ↑ Bernstein, 2002, p. 402.
- ↑ Lutz, 2006, p. 1218.
- ↑ Запись о RelStorage на PyPI . Дата обращения: 20 июля 2012. Архивировано 26 ноября 2013 года.
- ↑ Запись о DirectoryStorage на PyPI . Дата обращения: 20 июля 2012. Архивировано 9 марта 2016 года.
- ↑ Запись о DemoStorage на PyPI . Дата обращения: 20 июля 2012. Архивировано 8 января 2011 года.
- ↑ Grok tutorial . Дата обращения: 6 января 2016. Архивировано 9 мая 2015 года.
- ↑ Zenoss Data Stores . Дата обращения: 16 июля 2012. Архивировано 8 августа 2012 года.
- ↑ KARL — Managing Your Knowledge . Дата обращения: 6 января 2016. Архивировано 25 декабря 2015 года.
- ↑ ZEO Архивировано 20 марта 2011 года. (из документации по Indico)
- ↑ Indico . Дата обращения: 17 июля 2012. Архивировано 10 июля 2012 года.
Литература
править- Mark Lutz. Programming Python, 3rd Edition. — O'Reilly Media, 2006. — 1600 с. — P. 1216–1226. — ISBN 978-0-596-00925-0.
- Michael R. Bernstein, Scott Robertson and Coedit Development Team. Zope Bible. — Hungry Minds, 2002. — P. 397–411. — ISBN 0764548573.
- Philipp Weitershausen. Web Component Development With Zope 3. — Springer, 2007. — ISBN 978-3-540-33807-9.
- Carlos de la Guardia. Chapter 9. Grok and the ZODB // Grok 1.0 Web Development. — Packt Publishing, 2010. — 308 p. — ISBN 978-1-847197-48-1.
Ссылки
править- Официальный сайт документации по ZODB (англ.)
- Introduction to the Zope Object Database, Jim Fulton, 2000 (англ.)
- ZODB Book (англ.) («Книга ZODB», которая пишется усилиями сообщества)
- Zope/ZODB FAQ for IT Administrators