0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>Теги: python, web-разработка, web dev, web, web development, sqlalchemy, session, sessionmaker, scoped_session, бд</p>
1
<p>Теги: python, web-разработка, web dev, web, web development, sqlalchemy, session, sessionmaker, scoped_session, бд</p>
2
<p>Как сделать так, чтобы общение с базой данных было наиболее оптимальным, защищённым от ошибок и лишнего потребления ресурсов? Сначала давайте разберёмся с тем, какие в<strong>SQLAlchemy</strong>есть сущности для работы с сессиями и за что они отвечают.</p>
2
<p>Как сделать так, чтобы общение с базой данных было наиболее оптимальным, защищённым от ошибок и лишнего потребления ресурсов? Сначала давайте разберёмся с тем, какие в<strong>SQLAlchemy</strong>есть сущности для работы с сессиями и за что они отвечают.</p>
3
<p>Основных три: - session, - sessionmaker, - scoped_session.</p>
3
<p>Основных три: - session, - sessionmaker, - scoped_session.</p>
4
<p><strong>Session</strong>- непосредственно класс сессии. В его экземпляре хранятся изменения в текущей сессии, его можно настроить на автокоммит, он умеет отправлять данные в БД и ещё много чего.</p>
4
<p><strong>Session</strong>- непосредственно класс сессии. В его экземпляре хранятся изменения в текущей сессии, его можно настроить на автокоммит, он умеет отправлять данные в БД и ещё много чего.</p>
5
<p><strong>Sessionmaker</strong>- фабрика для создания экземпляров<strong>Session</strong>с заданными параметрами. Это просто штука, которая немного упрощает жизнь: вместо того, чтобы каждый раз указывать список аргументов у сессии, его достаточно один раз указать у фабрики, а дальше уже создавать сессии без указания аргументов.</p>
5
<p><strong>Sessionmaker</strong>- фабрика для создания экземпляров<strong>Session</strong>с заданными параметрами. Это просто штука, которая немного упрощает жизнь: вместо того, чтобы каждый раз указывать список аргументов у сессии, его достаточно один раз указать у фабрики, а дальше уже создавать сессии без указания аргументов.</p>
6
<p>Наконец,<strong>scoped_session</strong>- это хранилище уже созданных сессий, каждая из которых привязана к своему треду. Если вызвать сконфиругированный экземпляр<strong>scoped_session</strong>в новом треде, он создаст новую сессию. А если потом из этого же треда вызвать<strong>scoped_session</strong>во второй раз, он вернёт ту же сессию, а не создаст новую.</p>
6
<p>Наконец,<strong>scoped_session</strong>- это хранилище уже созданных сессий, каждая из которых привязана к своему треду. Если вызвать сконфиругированный экземпляр<strong>scoped_session</strong>в новом треде, он создаст новую сессию. А если потом из этого же треда вызвать<strong>scoped_session</strong>во второй раз, он вернёт ту же сессию, а не создаст новую.</p>
7
<h2>А теперь несколько советов:</h2>
7
<h2>А теперь несколько советов:</h2>
8
<ol><li>Передавать в каждую функцию сессию - это очевидно, но не обязательно. Достаточно использовать глобальную<strong>scoped_session</strong>: это не создаст нового коннекта в БД. Это делает функцию грязной и создаёт неявную зависимость, но и с этим можно бороться: например, сделать такую функцию методом модели или поселить в отдельный модуль, в котором все функции общаются с базой.</li>
8
<ol><li>Передавать в каждую функцию сессию - это очевидно, но не обязательно. Достаточно использовать глобальную<strong>scoped_session</strong>: это не создаст нового коннекта в БД. Это делает функцию грязной и создаёт неявную зависимость, но и с этим можно бороться: например, сделать такую функцию методом модели или поселить в отдельный модуль, в котором все функции общаются с базой.</li>
9
<li>Подход выше не стоит использовать для атомарных функций, который будут использоваться в качестве частей более сложных, но атомарных операций: он усложняет управление транзакциями.</li>
9
<li>Подход выше не стоит использовать для атомарных функций, который будут использоваться в качестве частей более сложных, но атомарных операций: он усложняет управление транзакциями.</li>
10
<li>При написании кода стоит хорошо понимать, где транзакция должна начинаться и где заканчиваться, избегать подвисших транзакций и делать код, говорящий об этом, как можно более явным.</li>
10
<li>При написании кода стоит хорошо понимать, где транзакция должна начинаться и где заканчиваться, избегать подвисших транзакций и делать код, говорящий об этом, как можно более явным.</li>
11
<li>После написания тестирования уделите время тестированию взаимодействия с БД: запустите код с большим количеством данных, посмотрите на то, насколько нагружена БД, не создаётся ли лишних соединений, удаляет ли скрипт за собой все транзакции и пр. Если этого не сделать, велика вероятность, что рано или поздно БД упадёт, а это как правило очень плохо.</li>
11
<li>После написания тестирования уделите время тестированию взаимодействия с БД: запустите код с большим количеством данных, посмотрите на то, насколько нагружена БД, не создаётся ли лишних соединений, удаляет ли скрипт за собой все транзакции и пр. Если этого не сделать, велика вероятность, что рано или поздно БД упадёт, а это как правило очень плохо.</li>
12
</ol><p><em>Есть вопрос? Напишите в комментариях!</em></p>
12
</ol><p><em>Есть вопрос? Напишите в комментариях!</em></p>
13
13