ZODB

Поделись знанием:
Перейти к: навигация, поиск
Zope Object DataBase
Тип

Объектно-ориентированная база данных

Разработчик

Zope Corporation и соавторы

Написана на

Python

Операционная система

Кроссплатформенное ПО

Последняя версия

4.2.0 (2 июня 2015 [1])

Лицензия

Zope Public License

Сайт

[www.zodb.org/ b.org]

К:Википедия:Статьи без изображений (тип: не указан)

ZODB (англ. Zope Object Database) — объектно-ориентированная база данных (ООБД) для Python-объектов. Входит в поставку сервера приложений Zope, но может использоваться и отдельно от него. Для балансировки нагрузки и кластеризации серверов служит ZEO (от англ. Zope Enterprise Objects). Эта клиент-серверная технология позволяет нескольким Zope-серверам (то есть ZEO-клиентам) разделять единое хранилище данных[2]. ZODB используется в различных системах управления содержимым, в том числе Plone.





История

Создана Джимом Фултоном из Zope Corporation в конце 1990-х годов. В начале, в процессе разработки системы Principia (ставшей позднее именоваться Zope) называлась POS (от англ. Persistent Object System — система устойчивых объектов) или BoboPOS[3]. При очередном значительном изменении архитектуры была переименована в ZODB3. Был также короткоживущий проект ZODB4 по переписыванию ZODB3 на «чистом» Python в начале 2000-х годов[4], но он не был завершён (не следует путать с версиями 4, появившимися в 2012 году[1]).

Свойства

Некоторые свойства ZODB[5][6]:

Прозрачность

С объектами приложения, использующего 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].

Напишите отзыв о статье "ZODB"

Примечания

  1. 1 2 [pypi.python.org/pypi/ZODB ZODB3 4.2.0]
  2. Bernstein, 2002, p. 563.
  3. по данным исторической справки в README-файле в поставке исходного кода название было BoboPOS
  4. [old.zope.org/Products/ZODB4/ ZODB4]
  5. [www.zodb.org/ www.zodb.org]
  6. [www.komtet.ru/lib/frameworks/zope/zope-2/zope-ispolzuet-obektnuyu-bazu-dannyh Zope использует объектную базу данных]
  7. Zope Foundation. [www.zodb.org/documentation/guide/prog-zodb.html ZODB Programming]. [www.webcitation.org/69CgJJU7S Архивировано из первоисточника 16 июля 2012].
  8. [wiki.zope.org/ZODB/MultiVersionConcurrencyControl Multiversion concurrency control (MVCC)]
  9. Weitershausen, 2007, pp. 84-85.
  10. Bernstein, 2002, p. 401.
  11. Патрик О'Брайен (Patrick O'Brien). [www.iso.ru/rus/document5933.phtml Управление персистентностью Python]. [www.webcitation.org/69DV14wn3 Архивировано из первоисточника 17 июля 2012].
  12. Lutz, 2006, pp. 1218-1219.
  13. [www.komtet.ru/lib/frameworks/zope/vvedenie-v-zodb.-avtor-michel-pelletier Введение в ZODB]
  14. [wiki.zope.org/ZODB/guide/node3.html ZODB Programming]
  15. Bernstein, p. 399.
  16. [www.zodb.org/documentation/guide/modules.html ZODB programming guide — Related modules]
  17. Bernstein, p. 402.
  18. Lutz, 2006, p. 1218.
  19. [pypi.python.org/pypi/RelStorage/ Запись о RelStorage на PyPI]
  20. [pypi.python.org/pypi/DirectoryStorage Запись о DirectoryStorage на PyPI]
  21. [pypi.python.org/pypi/zc.demostorage2 Запись о DemoStorage на PyPI]
  22. [grok.zope.org/documentation/tutorial/adder-an-adding-machine-sample-application/a-grok-application-and-grok-model/ Grok tutorial]
  23. [community.zenoss.org/docs/DOC-3153 Zenoss Data Stores]
  24. [quintagroup.com/cms/python/karl KARL - Managing Your Knowledge]
  25. [indico-software.org/wiki/Dev/Technical/ZEO ZEO] (из документации по Indico)
  26. [indico-software.org/ Indico]

Ссылки

  • [www.zodb.org/ Официальный сайт документации по ZODB] (англ.)
  • [ftp.python.org/workshops/2000-01/proceedings/papers/fulton/fulton-zodb3.pdf Introduction to the Zope Object Database, Jim Fulton, 2000] (англ.)
  • [zodb.readthedocs.org/en/latest/index.html ZODB Book] (англ.) («Книга ZODB», которая пишется усилиями сообщества)
  • [www.coactivate.org/projects/plone-marketing/zope-zodb-faq-for-it-administrators Zope/ZODB FAQ for IT Administrators]

Литература

  • 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.
  • 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

– Держу за Стивенса сто! – кричал один.
– Смотри не поддерживать! – кричал другой.
– Я за Долохова! – кричал третий. – Разними, Курагин.
– Ну, бросьте Мишку, тут пари.
– Одним духом, иначе проиграно, – кричал четвертый.
– Яков, давай бутылку, Яков! – кричал сам хозяин, высокий красавец, стоявший посреди толпы в одной тонкой рубашке, раскрытой на средине груди. – Стойте, господа. Вот он Петруша, милый друг, – обратился он к Пьеру.
Другой голос невысокого человека, с ясными голубыми глазами, особенно поражавший среди этих всех пьяных голосов своим трезвым выражением, закричал от окна: «Иди сюда – разойми пари!» Это был Долохов, семеновский офицер, известный игрок и бретёр, живший вместе с Анатолем. Пьер улыбался, весело глядя вокруг себя.
– Ничего не понимаю. В чем дело?
– Стойте, он не пьян. Дай бутылку, – сказал Анатоль и, взяв со стола стакан, подошел к Пьеру.
– Прежде всего пей.
Пьер стал пить стакан за стаканом, исподлобья оглядывая пьяных гостей, которые опять столпились у окна, и прислушиваясь к их говору. Анатоль наливал ему вино и рассказывал, что Долохов держит пари с англичанином Стивенсом, моряком, бывшим тут, в том, что он, Долохов, выпьет бутылку рому, сидя на окне третьего этажа с опущенными наружу ногами.
– Ну, пей же всю! – сказал Анатоль, подавая последний стакан Пьеру, – а то не пущу!
– Нет, не хочу, – сказал Пьер, отталкивая Анатоля, и подошел к окну.
Долохов держал за руку англичанина и ясно, отчетливо выговаривал условия пари, обращаясь преимущественно к Анатолю и Пьеру.
Долохов был человек среднего роста, курчавый и с светлыми, голубыми глазами. Ему было лет двадцать пять. Он не носил усов, как и все пехотные офицеры, и рот его, самая поразительная черта его лица, был весь виден. Линии этого рта были замечательно тонко изогнуты. В средине верхняя губа энергически опускалась на крепкую нижнюю острым клином, и в углах образовывалось постоянно что то вроде двух улыбок, по одной с каждой стороны; и всё вместе, а особенно в соединении с твердым, наглым, умным взглядом, составляло впечатление такое, что нельзя было не заметить этого лица. Долохов был небогатый человек, без всяких связей. И несмотря на то, что Анатоль проживал десятки тысяч, Долохов жил с ним и успел себя поставить так, что Анатоль и все знавшие их уважали Долохова больше, чем Анатоля. Долохов играл во все игры и почти всегда выигрывал. Сколько бы он ни пил, он никогда не терял ясности головы. И Курагин, и Долохов в то время были знаменитостями в мире повес и кутил Петербурга.
Бутылка рому была принесена; раму, не пускавшую сесть на наружный откос окна, выламывали два лакея, видимо торопившиеся и робевшие от советов и криков окружавших господ.
Анатоль с своим победительным видом подошел к окну. Ему хотелось сломать что нибудь. Он оттолкнул лакеев и потянул раму, но рама не сдавалась. Он разбил стекло.
– Ну ка ты, силач, – обратился он к Пьеру.
Пьер взялся за перекладины, потянул и с треском выворотип дубовую раму.
– Всю вон, а то подумают, что я держусь, – сказал Долохов.
– Англичанин хвастает… а?… хорошо?… – говорил Анатоль.
– Хорошо, – сказал Пьер, глядя на Долохова, который, взяв в руки бутылку рома, подходил к окну, из которого виднелся свет неба и сливавшихся на нем утренней и вечерней зари.
Долохов с бутылкой рома в руке вскочил на окно. «Слушать!»
крикнул он, стоя на подоконнике и обращаясь в комнату. Все замолчали.
– Я держу пари (он говорил по французски, чтоб его понял англичанин, и говорил не слишком хорошо на этом языке). Держу пари на пятьдесят империалов, хотите на сто? – прибавил он, обращаясь к англичанину.
– Нет, пятьдесят, – сказал англичанин.
– Хорошо, на пятьдесят империалов, – что я выпью бутылку рома всю, не отнимая ото рта, выпью, сидя за окном, вот на этом месте (он нагнулся и показал покатый выступ стены за окном) и не держась ни за что… Так?…
– Очень хорошо, – сказал англичанин.
Анатоль повернулся к англичанину и, взяв его за пуговицу фрака и сверху глядя на него (англичанин был мал ростом), начал по английски повторять ему условия пари.
– Постой! – закричал Долохов, стуча бутылкой по окну, чтоб обратить на себя внимание. – Постой, Курагин; слушайте. Если кто сделает то же, то я плачу сто империалов. Понимаете?
Англичанин кивнул головой, не давая никак разуметь, намерен ли он или нет принять это новое пари. Анатоль не отпускал англичанина и, несмотря на то что тот, кивая, давал знать что он всё понял, Анатоль переводил ему слова Долохова по английски. Молодой худощавый мальчик, лейб гусар, проигравшийся в этот вечер, взлез на окно, высунулся и посмотрел вниз.
– У!… у!… у!… – проговорил он, глядя за окно на камень тротуара.
– Смирно! – закричал Долохов и сдернул с окна офицера, который, запутавшись шпорами, неловко спрыгнул в комнату.
Поставив бутылку на подоконник, чтобы было удобно достать ее, Долохов осторожно и тихо полез в окно. Спустив ноги и расперевшись обеими руками в края окна, он примерился, уселся, опустил руки, подвинулся направо, налево и достал бутылку. Анатоль принес две свечки и поставил их на подоконник, хотя было уже совсем светло. Спина Долохова в белой рубашке и курчавая голова его были освещены с обеих сторон. Все столпились у окна. Англичанин стоял впереди. Пьер улыбался и ничего не говорил. Один из присутствующих, постарше других, с испуганным и сердитым лицом, вдруг продвинулся вперед и хотел схватить Долохова за рубашку.
– Господа, это глупости; он убьется до смерти, – сказал этот более благоразумный человек.
Анатоль остановил его:
– Не трогай, ты его испугаешь, он убьется. А?… Что тогда?… А?…
Долохов обернулся, поправляясь и опять расперевшись руками.
– Ежели кто ко мне еще будет соваться, – сказал он, редко пропуская слова сквозь стиснутые и тонкие губы, – я того сейчас спущу вот сюда. Ну!…
Сказав «ну»!, он повернулся опять, отпустил руки, взял бутылку и поднес ко рту, закинул назад голову и вскинул кверху свободную руку для перевеса. Один из лакеев, начавший подбирать стекла, остановился в согнутом положении, не спуская глаз с окна и спины Долохова. Анатоль стоял прямо, разинув глаза. Англичанин, выпятив вперед губы, смотрел сбоку. Тот, который останавливал, убежал в угол комнаты и лег на диван лицом к стене. Пьер закрыл лицо, и слабая улыбка, забывшись, осталась на его лице, хоть оно теперь выражало ужас и страх. Все молчали. Пьер отнял от глаз руки: Долохов сидел всё в том же положении, только голова загнулась назад, так что курчавые волосы затылка прикасались к воротнику рубахи, и рука с бутылкой поднималась всё выше и выше, содрогаясь и делая усилие. Бутылка видимо опорожнялась и с тем вместе поднималась, загибая голову. «Что же это так долго?» подумал Пьер. Ему казалось, что прошло больше получаса. Вдруг Долохов сделал движение назад спиной, и рука его нервически задрожала; этого содрогания было достаточно, чтобы сдвинуть всё тело, сидевшее на покатом откосе. Он сдвинулся весь, и еще сильнее задрожали, делая усилие, рука и голова его. Одна рука поднялась, чтобы схватиться за подоконник, но опять опустилась. Пьер опять закрыл глаза и сказал себе, что никогда уж не откроет их. Вдруг он почувствовал, что всё вокруг зашевелилось. Он взглянул: Долохов стоял на подоконнике, лицо его было бледно и весело.
– Пуста!
Он кинул бутылку англичанину, который ловко поймал ее. Долохов спрыгнул с окна. От него сильно пахло ромом.
– Отлично! Молодцом! Вот так пари! Чорт вас возьми совсем! – кричали с разных сторон.
Англичанин, достав кошелек, отсчитывал деньги. Долохов хмурился и молчал. Пьер вскочил на окно.
Господа! Кто хочет со мною пари? Я то же сделаю, – вдруг крикнул он. – И пари не нужно, вот что. Вели дать бутылку. Я сделаю… вели дать.
– Пускай, пускай! – сказал Долохов, улыбаясь.
– Что ты? с ума сошел? Кто тебя пустит? У тебя и на лестнице голова кружится, – заговорили с разных сторон.
– Я выпью, давай бутылку рому! – закричал Пьер, решительным и пьяным жестом ударяя по столу, и полез в окно.
Его схватили за руки; но он был так силен, что далеко оттолкнул того, кто приблизился к нему.
– Нет, его так не уломаешь ни за что, – говорил Анатоль, – постойте, я его обману. Послушай, я с тобой держу пари, но завтра, а теперь мы все едем к***.
– Едем, – закричал Пьер, – едем!… И Мишку с собой берем…