Как я могу предотвратить незакрытые соединения БД при использовании глобального объекта сеанса SQLAlchemy? - PullRequest
0 голосов
/ 05 января 2019

Я работаю в компании над проектом, в котором, похоже, должно быть нормально использовать одну глобальную переменную сеанса:

Пример

/src/__init__.py (точка входа в программу):

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

engine = create_engine('mysql://%s:%s@%s/%s' % (username, password, host, db_name))
Session = sessionmaker(bind=engine)
session = Session()


def main():
    from src.example import example_function

    example_function()


if __name__ == '__main__':
    main()

/src/example.py (пример импорта сеанса в другой файл):

from src import session

def example_function():
    objects = session.query(ExampleTable).all()

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

Пример того, что я не хочу делать

/src/__init__.py (точка входа в программу):

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

engine = create_engine('mysql://%s:%s@%s/%s' % (username, password, host, db_name))
Session = sessionmaker(bind=engine)


def main(session):
    from src.example import example_function

    example_function(session)


if __name__ == '__main__':
    try:
        session = Session()
        main(session)
    finally:
        session.close()

/src/example.py (пример использования объекта сеанса в другом файле):

def example_function(session):
    objects = session.query(ExampleTable).all()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...