В прошлом разделе мы сосредоточили внимание на языке выражений SQL из части Core, теперь же, в порядке продолжения исследования частей алхимии, мы приступим к обзору жизненного цикла Session и как она взаимодействует с теми или иными конструкциями.
Мы уже говорили в первых разделах о том, что ORM в Алхимии использует такой паттерн как “объединение работ” (unit of work). Теперь же нам необходимо понять как именно этот паттерн используется в ORM части.
Сессия (Session) ответственна за конструирование INSERT запросов и их отправку в базу данных. Для нас же важно уметь добавлять объекты в сессию, а также переносить объекты в транзакцию (или флашить их). Об остальном позаботится алхимия.
В предыдущем разделе мы научились делать INSERT используя Python словари для передачи той информации, которую мы хотим добавить в базу, с такой же целью в ORM мы используем модели, или если быть точнее, их инстанции (мы уже обсуждали модели ранее). Модели User и Adress служат нам как место, куда мы можем записать соответствующую информацию о строках в базе данных. Ниже мы создадим два объекта User, каждый из которых представляет потенциальную строчку в бд, которые мы хотим за-INSERT-ить:
squidward = User(name="squidward", fullname="Squidward Tentacles")
krabs = User(name="ehkrabs", fullname="Eugene H. Krabs")
Модели по умолчанию переопределяют метод init(), который, как известно, отвечает за инициализацию инстанций класса, поэтому мы можем просто передать в качестве именованных аргументов те или иные столбцы в наших классах.
Обратите внимание, что мы не передаем никакое значение для столбца id при создании модели. Дело в том, что это значение автоинкрементируемое, и является внешним ключем. Иначе говоря, это значение должна определять база данных самостоятельно. Давайте попробуем запринтить только что созданный объект и посмотреть на то, какое же будет значение id у него:
>>> squidward
User(id=None, name='squidward', fullname='Squidward Tentacles')
Как вы видите, значение является None. Столбец еще не имеет никакого значения, поскольку объект модели еще не был записан в БД. Данное состояние модели, когда она еще не была добавлена в сессию, называется transient (с англ. “временный”) - то есть она еще не является полноценной записью, а только лишь потенциальной.
Чтобы показать процесс добавления в сессию по шагам, мы создадим сессию без использования контекстного менеджера:
session = Session(engine)
Теперь объекты могут быть добавлены с помощью такого метода как Session.add. Как только объект будет передан в этот метод он получит статус pending (с англ. “ожидающий”):