Я работаю в компании над проектом, в котором, похоже, должно быть нормально использовать одну глобальную переменную сеанса:
Пример
/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()