Сохранение данных - ZODB
ЗОДБ (Zope object Database) - база данных для хранения объектов Python. Это ACID-совместимая функция, которой нет в базах данных NOSQL. ZODB также является открытым исходным кодом, горизонтально масштабируемым и свободным от схем, как и многие базы данных NoSQL. Однако он не распространяется и не обеспечивает легкую репликацию. Он предоставляет механизм сохранения для объектов Python. Он является частью сервера приложений Zope, но также может использоваться независимо.
ZODB был создан Джимом Фултоном из Zope Corporation. Все началось как простая система постоянных объектов. Текущая версия 5.5.0 полностью написана на Python. с использованием расширенной версии встроенной в Python персистентности объектов (pickle).
Некоторые из основных функций ZODB:
- transactions
- history/undo
- прозрачно подключаемое хранилище
- встроенное кеширование
- мультиверсионный контроль параллелизма (MVCC)
- масштабируемость по сети
ZODB - это hierarchicalбаза данных. Есть корневой объект, инициализируемый при создании базы данных. Корневой объект используется как словарь Python и может содержать другие объекты (которые сами могут быть подобны словарю). Чтобы сохранить объект в базе данных, достаточно назначить ему новый ключ внутри его контейнера.
ZODB полезен для приложений, в которых данные являются иерархическими и, вероятно, будет больше операций чтения, чем записи. ZODB - это расширение объекта pickle. Поэтому его можно обработать только через скрипт Python.
Для установки последней версии ZODB воспользуйтесь утилитой pip -
pip install zodb
Также установлены следующие зависимости -
- BTrees==4.6.1
- cffi==1.13.2
- persistent==4.5.1
- pycparser==2.19
- six==1.13.0
- transaction==2.4.0
ZODB предоставляет следующие варианты хранения -
Файловое хранилище
Это значение по умолчанию. Все хранится в одном большом файле Data.fs, который по сути является журналом транзакций.
DirectoryStorage
При этом хранится один файл на ревизию объекта. В этом случае не требуется перестраивать Data.fs.index при нечистом завершении работы.
RelStorage
Это хранит соленья в реляционной базе данных. Поддерживаются PostgreSQL, MySQL и Oracle.
Для создания базы данных ZODB нам понадобится хранилище, база данных и, наконец, соединение.
Первый шаг - получить объект хранения.
import ZODB, ZODB.FileStorage
storage = ZODB.FileStorage.FileStorage('mydata.fs')
Класс DB использует этот объект хранения для получения объекта базы данных.
db = ZODB.DB(storage)
Передайте None конструктору БД, чтобы создать базу данных в памяти.
Db=ZODB.DB(None)
Наконец, мы устанавливаем соединение с базой данных.
conn=db.open()
Затем объект подключения дает вам доступ к «корню» базы данных с помощью метода «root ()». «Корневой» объект - это словарь, содержащий все ваши постоянные объекты.
root = conn.root()
Например, мы добавляем список студентов к корневому объекту следующим образом:
root['students'] = ['Mary', 'Maya', 'Meet']
Это изменение не сохраняется в базе данных навсегда, пока мы не зафиксируем транзакцию.
import transaction
transaction.commit()
Для хранения объекта определенного пользователем класса этот класс должен быть унаследован от родительского класса persistent.Persistent.
Преимущества подклассов
Создание подкласса Persistent class имеет следующие преимущества:
База данных будет автоматически отслеживать изменения объекта, сделанные путем установки атрибутов.
Данные будут сохранены в отдельной записи базы данных.
Вы можете сохранить данные, которые не являются подклассом Persistent, но они будут храниться в записи базы данных любого постоянного объекта, на который он ссылается. Непостоянные объекты принадлежат содержащему их постоянному объекту, и если несколько постоянных объектов ссылаются на один и тот же непостоянный подобъект, они получат свои собственные копии.
Позвольте использовать определение подкласса студенческого класса, подкласса Persistent class как под -
import persistent
class student(persistent.Persistent):
def __init__(self, name):
self.name = name
def __repr__(self):
return str(self.name)
Чтобы добавить объект этого класса, давайте сначала настроим соединение, как описано выше.
import ZODB, ZODB.FileStorage
storage = ZODB.FileStorage.FileStorage('studentdata.fs')
db = ZODB.DB(storage)
conn=db.open()
root = conn.root()
Объявите объект как добавленный в root, а затем зафиксируйте транзакцию
s1=student("Akash")
root['s1']=s1
import transaction
transaction.commit()
conn.close()
Список всех объектов, добавленных в корневой каталог, можно получить как объект просмотра с помощью метода items (), поскольку корневой объект аналогичен встроенному в словарь.
print (root.items())
ItemsView({'s1': Akash})
Чтобы получить атрибут определенного объекта из корня,
print (root['s1'].name)
Akash
Объект легко обновляется. Поскольку ZODB API - это чистый пакет Python, он не требует использования какого-либо внешнего языка типа SQL.
root['s1'].name='Abhishek'
import transaction
transaction.commit()
База данных будет обновляться мгновенно. Обратите внимание, что класс транзакции также определяет функцию abort (), которая аналогична управлению транзакцией rollback () в SQL.