Автостопом по Python.

PonyORM.

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

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

Автостопом по Python.

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

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

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

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

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

Автостопом по Python.Отношение 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.

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

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