SQLAlchemy — что это такое и как с ней химичить? Часть 3
Python и 1000 программ
В прошлой части мы разобрались как устанавливать библиотеку, соединять с базой данных, а также создавать таблицу. В этой части мы разберем как определять класс Python для отображения в таблице, настраивать отображение, а также декларатировать создание таблицы, класса, и отображения за один раз.
Создание сессии
Теперь мы можем приступить к общению с нашей базой данных. Для этого мы будем использовать сессию "Session". После запуска нашего приложения, на том же уровне что и create_engine() мы определяем класс Session, оно будем служить некой фабрикой для новых объектов сессий.

Если в нашем приложение отсутствует Engine-объект, мы можем сделать так:

Далее, после подключения к бд с помощью create_engine() используйте соединение с его сессией, используя configure():

Таким образом, класс Session будем создавать новые объекты session, привязанные к нашей бд.
Во время общения с базой, вам нужно создать объект класса Session:

Наша сессия ассоциируется с базой данных SQLite3, но нет открытого соединения с бд. Во время использование, происходит соединение из набора соединение, поддерживающееся при помощи engine. Это соединение будет идти до тех пор, пока не будут применены изменения и/или мы не закроем объект сессии.
Добавление новых объектов
Для сохранение нашего User-объекта, мы должны добавить его к нашей сессии, использовав вызов add():

Данный объект будет ждать сохранения, SQL-запросы пока не будут посланы. SQL-запросы будут посланы сессией, для того чтобы сохранить Васю, в случае необходимости, используя процесс сброса на диск(flush). Когда мы запросим Васю из бд, в начале все сбросится на диск, а только потом пойдет последовательно.
В качестве примера, мы создадим новый объект запроса(Query), который будет загружать User-объекты. Мы производим отсортировку по атрибуту, то есть "name=Вася", и говорим базе, что нам нужен только первый результат из всего списка строк. Возвращается тот User, который равен добавленному:

На деле, сессия определила, что запись из таблицы, что она вернула, одна и та же запись, что она представляла во внутренней хеш-таблице объектов. По итогу мы получили идентичный объект.
Концепция ORM, что работает здесь, известна нам как "Карта идентичности". Она оперирует одним и тем же набором данных внутри сессии. Когда объект с неким ключом появится в сессии, SQL запросы вернут те же объекты, для этого самого первичного ключа. Ошибка возникнет в том случае, если мы поместим в эту сессию другой, уже сохраненный объект с одинаковым первичным ключом.
Есть возможность добавить больше User-объектов, использовав add_all():

Вася решил сменить пароль:

Сессия следит за ним. Для наглядности, она знает что Вася был модифицирован:

И что еще пара User’ов ожидают сброса в базу:

Когда мы захотим отправить все изменения в базу и применить все изменения, зафиксировав транзакцию, которая была в процессе. Мы можем воспользоваться помощью commit():

Данная команда сбрасывает все оставшиеся изменения в базу и фиксирует транзакции. Ресурсы подключения освобождаются и возвращаются в набор. Последовательные операции с сессией буду происходит в новой транзакции, которая также будет запрашивать ресурсы как в первом требовании. Если взглянуть на Васин атрибут id, что раньше был None, то мы увидим, что ему присвоено значение

Далее, когда сессия вставит новые записи в базу, созданные идентификаторы будут доступны в объекте, немеделннно или по первому требованию. В нашем случае, целая запись была перезагружена при доступе, так как после вызова commit() началась новая транзакция. SQLAlchemy стандартно обновляет данные от предыдущей транзакции при первом обращении с новой транзакцией, так что нам доступно самое последнее ее состояние. Уровень подгрузки настраивается, как описано в главе «Сессии».