Python запускает приложение на основе соединения только внутри функций или методов

У меня есть приложение, которое использует connexion и swagger, и оно уже довольно большое. Как и в примерах этого фреймворка, соединения с базой данных создаются вне какой-либо функции или класса. Я нахожу этот подход очень плохим дизайном, и я действительно чувствую, что должно быть одно место (например, main()), где создаются все необходимые объекты и для них вызывается какой-то метод .run().

Минимум, который я хочу, — это иметь по крайней мере функции, зарегистрированные в swagger.yaml в качестве обработчиков конечных точек, чтобы принимать предоставляемое мной подключение к базе данных, а не такое, которое должно быть создано при запуске приложения и доступно для всех функций.

Есть ли способ добиться чего-то подобного, или мне нужно смириться с тем, что соединение с базой данных создается в одном файле, а все остальные файлы импортируют его и используют?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
133
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В приведенном вами примере я считаю прискорбным, что мы называем orm.init_db('sqlite:///:memory:') за пределами If Main. В примере это безвредно, но рассмотрим связанные случаи, такие как

  1. sqlite:////tmp/pets.db или
  2. TCP-соединение с сервером БД

Файл не может быть безопасно import изменен из-за побочных эффектов. оставляет после себя файл .db или, возможно, умирает с ошибкой подключения если нам не хватает кредитов или сетевого подключения. Это влияет, например. $ python -m doctest. Поэтому я предпочитаю откладывать создание соединения до тех пор, пока оно нам действительно не понадобится. что легко может сделать одноэлементный геттер. (Или попросите класс __init__() создать соединение.)


Для вашего приложения, вместо передачи глобального или параметрического соединения, рассмотрите возможность передачи объекта функции, который может получить соединение по мере необходимости. Это дает вам уровень косвенности и допускает условную обработку.

Именно то, что я думал. Мне очень нравится идея передать объект функции вместо того, чтобы создавать его при импорте файла. Я на самом деле боролся с этим, что касается интеграционных тестов, мне нужно было сначала установить переменные среды и только потом импортировать объект базы данных, что было просто хаком для решения плохого выбора дизайна. Спасибо!

Libor 16.12.2020 15:03

Другие вопросы по теме