Простой Python. Современный стиль программирования (Любанович) - страница 140

), а другие полагают, что его критикуют незаслуженно (http://bit.ly/fowler-orm). Независимо от того, кто прав, ORM — это абстракция, а все абстракции в какой-то момент разрушаются — они допускают утечки памяти. Если ORM не делает того, что вам нужно, вы должны понять, как он работает, а затем разобраться, как исправить это с помощью SQL. Перефразируя интернет-мем, некоторые люди, столкнувшись с проблемой, думают: «Точно, использую ORM». Теперь у них две проблемы. Старайтесь использовать ORM реже и, как правило, для простых приложений. Но если приложение кажется простым, то вам, возможно, стоит использовать простой SQL (или язык выражений SQL).

Или же вы можете попробовать еще более простой способ — dataset (https://dataset.readthedocs.org/). Он создан на основе SQLAlchemy и предоставляет простой ORM для хранилищ SQL, JSON и CSV.

Хранилища данных NoSQL

Некоторые базы данных не являются реляционными и не поддерживают SQL. Они были созданы для работы с очень крупными наборами данных, позволяют более гибко определять данные и поддерживают пользовательские операции с данными. Такие базы данных называют NoSQL (раньше это означало «не SQL», теперь же расшифровка звучит как «не только SQL»).

Семейство dbm

Форматы dbm существовали задолго до того, как появился NoSQL. Они представляют собой хранилища, работающие по принципу «ключ — значение», их часто встраивают в приложения вроде браузеров, чтобы поддерживать различные настройки. База данных dbm очень похожа на обычный словарь.

• Вы присваиваете значение ключу, и оно автоматически сохраняется в базе данных на диске.

• Вы можете получить значение с помощью ключа.

Рассмотрим простой пример. Второй аргумент следующего метода open() может принимать значения 'r' для чтения, 'w' для записи и 'c' для того и другого, создавая файл, если его не существует:

>>>> import dbm

>>>> db = dbm.open('definitions', 'c')

Для того чтобы создать пары «ключ — значение», просто присвойте значение ключу, как если бы вы работали со словарем:

>>>> db['mustard'] = 'yellow'

>>>> db['ketchup'] = 'red'

>>>> db['pesto'] = 'green'

Приостановимся и посмотрим, что мы уже имеем:

>>>> len(db)

>3

>>>> db['pesto']

>b'green'

Теперь закроем файл и откроем его снова, чтобы убедиться, что наши данные действительно были сохранены:

>>>> db.close()

>>>> db = dbm.open('definitions', 'r')

>>>> db['mustard']

>b'yellow'

Ключи и значения сохраняются как байты. Вы не можете итерировать по объектам базы данных db, но можете получить количество ключей с помощью функции len(). Обратите внимание на то, что функции get() и setdefault() работают точно так же, как и для словарей.