Комментарии 5
Чёт листал, листал статью, так и не понял какую проблему вы решили. Может быть вам попробовать ioc контейнер и ооп? Тогда вы сможете сессию прокидывать везде автоматически без каких либо проблем, а заодно и подменять в тестах куски на моки.
А неявные коммиты/ролбэки на мой вкус - зло.
Привет! В библиотеке есть ioc контейнер, правда пользователь не взаимодействует с ним явно, а через функции библиотеки.
Какую проблему решали: убрать бойлерплейт, упростить интеграцию в asgi приложение, сделать взаимодействие с сессиями очень простым, но безопасным. Предоставить удобные утилиты для работы с этими сессиями. И все это в готовом решении которое вставил и поехал.
Хотелось добиться вот такого: в самых простых api ручках - получил сессию, сделал требуемый sql запрос - все. Библиотека сама разобралась с открытием и закрытием сессии и транзакции. Нет никаких утечек и головной боли.
А при этом в сложных ручках не ограничиваться, открывать закрывать сессии и транзакции когда угодно. Как раз если хочется явно это делать, библиотека не мешает, а даже предоставляет для этого все возможности
У меня вот тут есть сравнение 3х подходов: в ручном управлении куча бойлерплейта. В dependency вот такой нельзя досрочно сделать коммит или закрытие сессии. Ну либо воротить там как раз контейнер и тогда все равно кучу кода придется писать. А вот с этой библиотекой простые ручки в пару строк можно написать.

Ни в одном из трёх вариантов, кстати, не вижу Depdency Injection, все опираются на какие-то глобальные переменные
begin использовать совершенно не требуется, алхимия неявно открывает транзакцию при первом запросе.
Чтобы закрыть транзакцию достаточно сделать session.commit() или session.rollback() прекрасно работает в любом подходе где есть сессия, полученная через любое количество прослоек.
Для того чтобы закрыть сессию с откатом всех транзакций достаточно сделать close() или использовать контекстный менеджер на сессии
Не стоит коммитить транзакцию непонятно где. Лучше это делать в самом верхнем слое бизнес логики (не важно как его назвать). Если коммита не было, обычное закрытие будет лучшим дефолтным поведением. Если коммит же делать где-то в обёртке, мы рискуем закоммить слишком поздно (и не поймать ошибки) или закоммить когда не надо (например, если ошибка была возвращена не через механику исключений, а через return)
Сессия обладает одним единственным коннектом, который она получает от engine.
Это, кстати, неправда. Алхимия поддерживает двухфазные транзакции и использование нескольких эндзинов в одной сессии, храня часть моделей в одном, часть в другом.
А ещё сессия может иметь 0 коннектов, это происходит до того как сделали первый запрос после открытия сессии или после завершения транзакции (при завершении транзакции, сессия возвращает Коннекты в пул)

context-async-sqlalchemy — лучший способ использовать sqlalchemy в async python приложении