HTML Diff
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