У нас есть приложение Python с более чем двадцатью модулями, большинство из которых разделяются несколькими веб-приложениями и консольными приложениями.
У меня никогда не было четкого представления о наилучшей практике установления и управления подключением к базе данных в приложениях с несколькими модулями Python. Рассмотрим этот пример:
У меня есть модуль, определяющий класс объектов для пользователей. Он имеет множество определений для создания/удаления/обновления пользователей в базе данных. Модуль users.py импортируется в: а) консольную утилиту, 2) веб-приложение на основе web.py и 3) постоянно работающий процесс демона.
Каждое из этих трех приложений имеет разные жизненные циклы. Демон может открыть соединение и оставить его открытым. Консольная утилита соединяется, работает и затем умирает. Конечно, HTTP-запросы являются атомарными, однако веб-сервер является демоном.
В настоящее время я открываю, используя затем закрытие соединения внутри каждой функции в классе Users. Это кажется наиболее неэффективным, но оно работает во всех примерах. Альтернативой, используемой в качестве теста, является объявление и открытие глобального соединения для всего модуля. Другой вариант - создать соединение на верхнем уровне приложения и передать ссылки при создании классов, но это кажется мне наихудшей идеей.
Я знаю, что каждая архитектура приложения отличается. Мне просто интересно, есть ли лучшая практика и что это будет?