У меня есть приложение, которое использует connexion и swagger, и оно уже довольно большое. Как и в примерах этого фреймворка, соединения с базой данных создаются вне какой-либо функции или класса. Я нахожу этот подход очень плохим дизайном, и я действительно чувствую, что должно быть одно место (например, main()), где создаются все необходимые объекты и для них вызывается какой-то метод .run().
Минимум, который я хочу, — это иметь по крайней мере функции, зарегистрированные в swagger.yaml в качестве обработчиков конечных точек, чтобы принимать предоставляемое мной подключение к базе данных, а не такое, которое должно быть создано при запуске приложения и доступно для всех функций.
Есть ли способ добиться чего-то подобного, или мне нужно смириться с тем, что соединение с базой данных создается в одном файле, а все остальные файлы импортируют его и используют?
В приведенном вами примере я считаю прискорбным, что мы называем
orm.init_db('sqlite:///:memory:')
за пределами If Main.
В примере это безвредно, но рассмотрим связанные случаи, такие как
Файл не может быть безопасно import
изменен из-за побочных эффектов.
оставляет после себя файл .db или, возможно, умирает с ошибкой подключения
если нам не хватает кредитов или сетевого подключения.
Это влияет, например. $ python -m doctest
.
Поэтому я предпочитаю откладывать создание соединения до тех пор, пока оно нам действительно не понадобится.
что легко может сделать одноэлементный геттер.
(Или попросите класс __init__()
создать соединение.)
Для вашего приложения, вместо передачи глобального или параметрического соединения, рассмотрите возможность передачи объекта функции, который может получить соединение по мере необходимости. Это дает вам уровень косвенности и допускает условную обработку.
Именно то, что я думал. Мне очень нравится идея передать объект функции вместо того, чтобы создавать его при импорте файла. Я на самом деле боролся с этим, что касается интеграционных тестов, мне нужно было сначала установить переменные среды и только потом импортировать объект базы данных, что было просто хаком для решения плохого выбора дизайна. Спасибо!