Привет, Хабр! Недавно передо мной встала задача написать на Python web-приложение для разделения счёта в ресторане между участниками трапезы. Так как нужна DB для хранения данных о заказах и пользователях, встал вопрос выбора ORM для работы с базой. Разработка велась на Flask, так что сразу отметается Django ORM и выбор изначально пал в сторону SQLAlchemy. С одной стороны эта ORM почти всемогущая, но за счет этого она довольно тяжела в освоении. Помучившись с алхимией какое-то время, я решил найти более простой вариант, чтоб разработка пошла быстрее. В итоге для проекта была выбрана Pony ORM.
 В глаза сразу бросилось то, что синтаксис написания запросов к базе менее громоздкий, чем в алхимии. Также на написание программы уходит меньше времени и строк кода.  Я решил написать небольшую обзорную статью, чтоб поделится опытом использования Пони. Надеюсь, она поможет начинающим программистам быстрее освоить разработку приложений, работающих с базами данных. Преимущества PonyORM: В качестве основного недостатка я бы выделил отсутствие механизма миграций (разработчики сейчас работают над этим) Взяв в расчет всё вышеперечисленное, можно сказать, что Pony довольно хорошее решение для работы с базами данных, кроме тех случаев, когда часто возникает необходимость изменять схему базы на продакшене. Далее я продемонстрирую основы работы с Pony на примере фрагментов кода из проекта, о котором я говорил выше. Настройка окружения Для начала нужно через pip установить Pony: Также нужно установить DB API для нужной СУБД: После этого импортируем в проект Pony: Создание объекта БД и привязка его к существующей базе Объект базы данных — это представление базы в питоновском коде. С базой работа происходит через этот объект. Далее этот объект нужно привязать к базе. Это можно сделать передав нужные параметры в конструктор класса Database либо вызвав метод db.bind() с нужными параметрами. Для разных СУБД они различаются. В данном проекте я работаю с базами SQLite (на этапе разработки) и PostgreSQL (продакшен). Для быстрого переключения между СУБД я прописал параметры в словаре, который храню в отдельном файле и передаю в конструктор объекта Database. Файл с параметрами подключения у меня выглядит так: А сама привязка происходит при создании объекта базы : Создание сущностей
Сначала я сделал схему базы в редакторе для создания ER диаграмм на сайте пони. Удобен он тем, что он может автоматически сгенерировать Python код для описания сущностей по сделанной в редакторе схеме. Сущности можно описать и вручную, но я воспользовался редактором для экономии времени.  На её основе был сгенерирован следующий код: Обобщив, можно сказать, что этот редактор может ускорить разработку для новичка в вопросах работы с базами. Запросы
Обращение к объекту по первичному ключу в пони реализовано оператором доступа к элементу (квадратные скобки). Например: В данном примере из таблицы Session берется строка, в которой id == sid.  Также, как я уже говорил выше, запросы в Pony можно писать генераторными выражениями, что делает их написание гораздо удобнее, чем в алхимии.
Снизу приведен пример, в котором базе посылается запрос на выборку пользователей, которые являются участниками данной сессии и не являются виртуальными пользователями. Заключение Надеюсь, моя статья оказалась кому-нибудь полезной. Если вас тоже заинтересовал Pony, внизу я оставлю ссылки на документацию и на телеграм-канал комьюнити.  Спасибо за внимание! Документация Pony
Телеграм коммьюнити Backend разработчик