незаслуженно (http://bit.ly/fowler-orm). Независимо от того, кто прав, ORM — это
абстракция, а все абстракции в какой-то момент разрушаются — они допускают
утечки памяти. Если ORM не делает того, что вам нужно, вы должны понять, как он
работает, а затем разобраться, как исправить это с помощью SQL. Перефразируя
интернет-мем, некоторые люди, столкнувшись с проблемой, думают: «Точно, ис-
пользую ORM». Теперь у них две проблемы. Старайтесь использовать ORM реже
и, как правило, для простых приложений. Но если приложение кажется простым, то
вам, возможно, стоит использовать простой SQL (или язык выражений SQL).
Или же вы можете попробовать еще более простой способ — dataset (https://
dataset.readthedocs.org/). Он создан на основе SQLAlchemy и предоставляет простой
ORM для хранилищ SQL, JSON и CSV.
244
Глава 8. Данные должны куда-то попадать
Хранилища данных 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'
Хранилища данных NoSQL