Interested Article - ZODB

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')     # открытый файл

Виды подключаемых хранилищ

  • Файловое хранилище ( англ. file storage ). Сохраняет объекты на диске. Рассчитано на один процесс.
  • Сетевое хранилище — ZEO. Позволяет многим процессам загружать и хранить объекты одновременно .
  • Хранилище RelStorage. Объекты сохраняются в реляционной СУБД .
  • Каталогизированное хранилище ( англ. directory storage ). Каждый объект хранится в отдельном файле файловой системы .
  • Демо-хранилище ( англ. demo storage ). Для хранения объектов дополнительно к базовому хранилищу, которое доступно только для чтения .

По данным каталога программного обеспечения для Python ( PyPI ) имеются и другие ZODB-хранилища, решающие более специализированные задачи.

Применение

ZODB используется в Zope , Plone (построен на Zope), , , ERP5 , KARL (система управления знаниями) и некоторых других системах. Например, ZODB и ZEO (без Zope ) используются в системе — программном обеспечении для организации симпозиумов, конференций , лекций и т. п., разработанном и используемом ЦЕРНом .

Примечания

  1. . Дата обращения: 6 января 2016. 27 января 2016 года.
  2. , p. 563.
  3. по данным исторической справки в README-файле в поставке исходного кода название было BoboPOS
  4. . Дата обращения: 6 января 2016. 5 марта 2016 года.
  5. . Дата обращения: 16 июля 2012. 8 августа 2012 года.
  6. . Дата обращения: 17 июля 2012. 24 марта 2016 года.
  7. Zope Foundation. . 16 июля 2012 года.
  8. 6 февраля 2012 года.
  9. , pp. 84—85.
  10. , p. 401.
  11. Патрик О’Брайен (Patrick O’Brien). . 17 июля 2012 года.
  12. , pp. 1218—1219.
  13. . Дата обращения: 17 июля 2012. 12 августа 2011 года.
  14. 9 февраля 2012 года.
  15. , p. 399.
  16. 28 декабря 2011 года.
  17. , p. 402.
  18. , p. 1218.
  19. . Дата обращения: 20 июля 2012. 26 ноября 2013 года.
  20. . Дата обращения: 20 июля 2012. 9 марта 2016 года.
  21. . Дата обращения: 20 июля 2012. 8 января 2011 года.
  22. . Дата обращения: 6 января 2016. 9 мая 2015 года.
  23. . Дата обращения: 16 июля 2012. 8 августа 2012 года.
  24. . Дата обращения: 6 января 2016. 25 декабря 2015 года.
  25. 20 марта 2011 года. (из документации по Indico)
  26. . Дата обращения: 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. . — Hungry Minds, 2002. — P. –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 // . — Packt Publishing, 2010. — 308 p. — ISBN 978-1-847197-48-1 .

Ссылки

  • (англ.)
  • (англ.)
  • (англ.) («Книга ZODB», которая пишется усилиями сообщества)


Источник —

Same as ZODB