SQLAlchemy — что это такое и как с ней химичить? Часть 2
Python и 1000 программВ прошлой части мы разобрались как устанавливать библиотеку, соединять с базой данных, а также создавать таблицу. В этой части мы разберем как определять класс Python для отображения в таблице, настраивать отображение, а также декларатировать создание таблицы, класса, и отображения за один раз.
Определение класса Python для отображения в таблицу

Класс Table хранит всю информацию о нашей базе, но к сожалению он ничего не знает о логике объекта, что используют нашим приложением. Для того чтобы было соответствия, нашей таблице "users" создадим элементарный класс "User". Нужно лишь унаследовать от стандартного класса Python object(проще сказать что это новый класс)

Здесь мы прописали __init__ как конструктор, __repr__ же нужен нам как вызов при операторе print. Они нужны нам лишь для удобства. Здесь они не обязательны и могут быть любой формы. SQLAlchemy не может вызывать __init__ напрямую
Настройка отображения
Теперь мы можем соединить нашу таблицу user_table и класс User. Для этого нам пригодиться пакет SQLAlchemy ORM. Создадим функцию mapper для отображения между таблицей и классом.

При помощи функции mapper() мы создаем новый mapper-объект для сохранения и дальнейшего его применения, ассоциирующего с нашим классом. Далее создаем объект User и проверяем его.

Атрибут id, не определенный в __init__ в любом случае будет существовать, лишь из-за того что она есть в колонке объекта таблицы user_table. По умолчанию mapper() создает атрибуты класса для всех колонок Table. Существуют они как дескрипторы и определяют его функционал. Она позволяет отслеживать изменения и автоматически подгружать данные в базу, в случае необходимости. Поскольку мы не приказали библиотеке сохранить "Василия" в базу, его id по умолчанию будет выставлено на "None". Позже когда мы сохраним его, оно будет автоматически сформированно на некое значение.
Декларативное создание таблицы, класса и отображения за один раз
Table, пользовательский класс и вызов mapper() - это простой пример использования библиотеки, в которой самое ценное это разделение задач. Множество приложений пожалуй не требуют такого разделения. Для них в библиотеке предоставляются альтернативы, более лаконичный стиль: декларативный.

Примером выше показана функция declarative_base(), определяющая новый класс, который мы назвали Base. От него унаследованы все наши ORM-классы. Прошу заметить, мы определили объекты Column без всяких строк имени, поскольку она будет выведена из имени нашего атрибута. Далее объект Table, созданный в declarative_base() версией User, доступен через атрибут __table__

Метаданные MetaData также будут доступны

Есть еще один декларативный метод для SQLAlchemy в сторонней библиотеки Elixir. Это полнофункциональная библиотека, включающая себя множесво встроенных конфигураций высокоуровневого отображения. Использование ORM будет действовать по такому же принципу, чтоо и классический SQLAlchemy