реклама
Бургер менюБургер меню

Кеннет Рейтц – Автостопом по Python (страница 68)

18

peewee хранит детали конфигурации в пространстве имен Meta, эта идея заимствована у Django.

Связываем каждый объект типа Model с базой данных.

Первичный ключ будет добавлен неявно, если вы не сделаете этого самостоятельно.

Эта строка добавляет атрибут purchases к записям Customer для упрощения доступа, но ничего не делает с таблицами.

Инициализируем данные и добавляем их в базу данных за один шаг с помощью метода create() или же сначала инициализируем их, а затем добавим (существуют настройки конфигурации для управления автоматической отправкой транзакций и вспомогательными программами для них). Это делается за один этап:

Добавьте объект (вроде cat) — и peewee будет использовать его первичный ключ.

В отношении «многие-ко-многим» нет ничего волшебного — просто добавьте новые записи вручную.

Пример запроса выглядит так:

>>> for p in Purchase.select(). where(Purchase.purchase_date > d — 1 * day):

… ····print(p.customer.name, p.purchase_date)

Douglas 1971-12-18

Cat 1971-12-19

>>>

>>> from peewee import fn

>>> q = (Cheese

… ····.select(Cheese.kind, fn.COUNT(Purchase.id). alias('num_purchased'))

… ····.join(PurchaseCheese)

… ····.join(Purchase)

… ····.group_by(Cheese.kind)

…)

>>> for chz in q:

… ····print(chz.kind, chz.num_purchased)

Camembert 2

Red Leicester 1

Вам доступна коллекция надстроек (https://peewee.readthedocs.org/en/latest/peewee/playhouse.html#playhouse), содержащая продвинутую поддержку транзакций[123], поддержку пользовательских функций, которые могут получать данные и выполнять их обработку до помещения в хранилище (например, сжатие или хэширование).

PonyORM

PonyORM (http://ponyorm.com/) применяет другой подход к грамматике запросов: вместо написания языка, похожего на SQL, или булевых выражений он использует синтаксис генератора Python. Также он имеет графический редактор схем, который может генерировать сущности PonyORM. Поддерживает Python версий 2.6+ и 3.3+.

Для того чтобы синтаксис оставался интуитивно понятным, Pony требует, чтобы все отношения между таблицами работали в обоих направлениях — все связанные таблицы должны явно ссылаться друг на друга, например так:

В базе данных Pony с помощью сущности Entity сохраняется состояние объекта, с ее помощью соединяются база данных и сам объект.

Pony использует стандартные типы Python для определения типа столбца — от str до datetime.datetime, в дополнение к определенным пользователем сущностям вроде Purchase, Customer и Cheese.

Здесь используется lambda: Purchase, потому что Purchase еще не определен.

orm.Set(lambda: Purchase) — первая половина определения отношения «один-ко-многим» между Customer и Purchase.

orm.Required(Customer) — вторая половина отношения «один-ко-многим» между Customer и Purchase.

Отношение orm.Set(Cheese), объединенное с orm.Set(lambda: Purchase) на шаге (3), определяет отношение «многие-ко-многим».

После того как мы определили сущности для данных, создание объекта будет выглядеть как и в других библиотеках. Сущности создаются на лету и отправляются с помощью вызова orm.commit():

camembert = Cheese(type='Camembert')

leicester = Cheese(type='Red Leicester')

cat = Customer(name='Cat')

doug = Customer(name='Douglas')

d = datetime.date(1971, 12, 18)

day = datetime.timedelta(1)

Purchase(date=(d — 1 * day), customer=doug, cheeses={camembert, leicester})

Purchase(date=d, customer=cat, cheeses={camembert})

orm.commit()

Запросы в Pony действительно выглядят так, будто написаны на чистом Python:

Так выглядит запрос, созданный с помощью синтаксиса генератора для Python.

Функция orm.count() объединяет объекты путем подсчета.

SQLObject

SQLObject (http://www.sqlobject.org/) (выпущен в октябре 2002 года) — самый старый ORM в нашем списке. Его реализация шаблона Active Record, а также оригинальная идея перегрузки стандартных операторов (вроде ==, <, <= и т. д.) как способа абстрагирования некоторой логики SQL в Python, которая теперь реализована почти во всех библиотеках ORM, сделали его весьма популярным.

Поддерживает множество баз данных (распространенные системы вроде MySQL, Postgres и SQLite и более экзотические вроде SAP DB, SyBase и MSSQL), но в данный момент — только Python 2.6 и Python 2.7. Его все еще активно сопровождают, но он становится менее распространенным по мере использования SQLAlchemy.

Records

Records (https://github.com/kennethreitz/records) — это минималистичная библиотека SQL, разработанная для отправки необработанных запросов SQL в разные базы данных. Представляет собой объединенные Tablib и SQLAlchemy, для которых написали хороший API и приложение командной строки (ведет себя как клиент SQL, способный выводить YAML, XLS и другие форматы Tablib). Records не собирается заменять библиотеки ORM; обычно он используется для выполнения запросов к базе данных и создания отчетов (например, ежемесячных отчетов в виде электронной таблицы, куда сохраняются последние данные о продажах). Данные могут быть использованы в программе или импортированы в один из многих полезных форматов:

>>> import records

>>> db = records.Database('sqlite:///mydb.db')

>>>

>>> rows = db.query('SELECT * FROM cheese')

>>> print(rows.dataset)

name·········|price

-|-

red leicester|1.0

wensleydale··|2.2

>>>

>>> print(rows.export('json'))